这是NSOperation的有效“主要”方法吗?

时间:2014-05-02 15:25:02

标签: ios objective-c grand-central-dispatch nsoperation

我在一个单独的队列中运行NSOperation,该队列无限期运行并设置为处理Web套接字事件。 事件在此操作中以- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message方法处理

如果这是NSOperation

,这是对主方法进行编码的正确方法吗?
- (void)main
{
    [self openSocket];

    while (!self.isCancelled) {
       //
    }
}

修改

NSOperation的主要目的是处理SocketRocket消息并发送请求。 处理和处理这些事件很好。但是如何让我的操作无限期地运行(不使用空的while循环)?

2 个答案:

答案 0 :(得分:3)

那是NSRunLoop的用途。根据{{​​3}}

  

运行循环是用于计划工作的事件处理循环   并协调收到的传入事件。跑步的目的   循环是为了让你的线程在工作时保持忙碌并把你的   线程在没有线程时休眠。

但是......我从你的代码中看到你正在使用Square的SocketRocket库,通过查看库的源代码,你可以找到apple's docs,所以你可能正在做的事情错误。你应该真正扩展你的问题,让我们了解真正的问题是什么,因为你的SocketRocket对象应该是ALREADY运行的,并且应该在特定事件发生时发送正确的通知。

编辑:

根据你所说的,你根本不需要一个无限期运行的对象,而只需要一个只要你的应用程序存活就能保持活着的对象。

为此,您可以使用应用程序委托,应用程序委托(也称为应用程序的委托属性)保持活动的对象或单个对象。现在,为了简单起见,我将使用第一个例子:

在你的应用程序的委托.m文件中实现SRWebSocket委托:

@interface SRAppDelegate()<SRWebSocketDelegate>

@property (strong, nonatomic) SRWebSocket* socket;

@end

@implementation SRAppDelegate

#pragma mark - SRWebSocketDelegate

- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
{

}

#pragma mark - SRWebSocketDelegate optionals

- (void)webSocketDidOpen:(SRWebSocket *)webSocket
{

}

- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
{

}

- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
{

}

@end

然后在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中初始化连接:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.socket = [[SRWebSocket alloc] initWithURLRequest:_YOUR_REQUEST_];
    self.socket.delegate = self;
    [self.socket open];
    //Enjoy!
}

现在你有一个很长的生活联系(只要你的申请还活着)。

答案 1 :(得分:0)

如果您有自己的套接字机制,可以通过使用NSRunLoop将其集成到CFRunLoopSource

这样做时(我常用的机器不在我身边,所以代码片段现在基本上无法访问)你可以使用CFEqual-[NSObject isEqual:]),CFHash(针对任何Objective-C的-[NSObject hash]),CFCopyDescription-[NSObject description]),CFRetain-[NSObject retain])和CFRelease-[NSObject release])对象 - 考虑你可以免费使用网桥NSObjectCFTypeRef,这样你就可以桥接演员self来填充infovoid *类型完全CFTypeRef)并使用这些函数作为CFRunLoopSource的回调,这里是perform回调的快速实现:

void _MSCFRunLoopPerformCallback(id self)
{
    [self runOnce];
}