我在一个单独的队列中运行NSOperation
,该队列无限期运行并设置为处理Web套接字事件。
事件在此操作中以- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
方法处理
如果这是NSOperation
?
- (void)main
{
[self openSocket];
while (!self.isCancelled) {
//
}
}
此NSOperation
的主要目的是处理SocketRocket
消息并发送请求。
处理和处理这些事件很好。但是如何让我的操作无限期地运行(不使用空的while
循环)?
答案 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]
)对象 - 考虑你可以免费使用网桥NSObject
和CFTypeRef
,这样你就可以桥接演员self
来填充info
(void *
类型完全CFTypeRef
)并使用这些函数作为CFRunLoopSource
的回调,这里是perform
回调的快速实现:
void _MSCFRunLoopPerformCallback(id self)
{
[self runOnce];
}