我在一个单独的队列中运行一个 NSOperation
,它会无限期地运行并设置为处理网络套接字事件。
在此操作中,事件在我的 - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
方法中处理
如果这个 NSOperation
,这是编写 main 方法的正确方法吗?
- (void)main
{
[self openSocket];
while (!self.isCancelled) {
//
}
}
编辑
这个NSOperation
的主要目的是处理SocketRocket
消息和发送请求。
处理和处理这些事件工作正常。但是如何让我的操作 make 无限期地运行(不使用空的 while
循环)?
最佳答案
这就是 NSRunLoop
的用途。根据 apple's docs
A run loop is an event processing loop that you use to schedule work and coordinate the receipt of incoming events. The purpose of a run loop is to keep your thread busy when there is work to do and put your thread to sleep when there is none.
但是......我从你的代码中看到你正在使用 Square 的 SocketRocket 库,通过查看库的源代码你可以找到 they are already doing this ,所以你可能做错了什么。您真的应该扩展您的问题,让我们了解真正的问题是什么,因为您的 SocketRocket 对象应该已经在运行,并且应该已经在特定事件发生时发送正确的通知。
编辑:
根据您所说的,您根本不需要一个无限期运行的对象,而是一个只要您的应用程序处于事件状态就保持事件状态的对象。
为此,您可以使用应用程序委托(delegate),一个由应用程序委托(delegate)(也称为应用程序委托(delegate)的属性)保持事件状态的对象或单例对象。现在,为了简单起见,我将使用第一个示例:
在您应用的委托(delegate) .m 文件中实现 SRWebSocket 委托(delegate):
@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!
}
现在您有一个长期有效的连接(只要您的应用程序处于事件状态)。
关于ios - 这是 NSOperation 的有效 'main' 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23431643/