ios - 这是 NSOperation 的有效 'main' 方法吗?

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

我在一个单独的队列中运行一个 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/

相关文章:

swift - Swift脚本中的崩溃是否是由竞争条件引起的?

ios - 如何在for循环中暂停调度队列?

iphone - 使用 UIwebView 加载 URL 时出现问题

带有静态 TableView 单元格的 IOS 8 动态类型 - 基本和副标题

ios - 状态栏在 iOS 6 上消失了

objective-c - IOS 应用程序将数据发送到 REST API 服务内容类型定义错误

ios - 从列出的 Plist 加载 NSDictionary

swift - Swift 中的嵌套异步调用

ios - UIActivityViewController,iOS, swift

ios - 如何在Swift 2.0中将结构保存到NSUserDefaults