gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:02:18 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com