Socket Rocket 异步委托方法
Socket Rocket Asynchronous delegate methods
使用 Socket Rocket 库进行 WebSocket 连接。
当我看到 Socket Rocket 的源代码时,可以清楚地看到它正在使用 dispatch_async
异步调用其委托 class(我的 class)的方法。
但是当在我的 class 中实现委托方法时,我放置了一个无限的 while 循环,UI 被阻塞了。
当委托方法已经被异步调用时,为什么会这样?
SRWebsocket.m
- (void)_handleMessage:(id)message
{
SRFastLog(@"Received message");
[self _performDelegateBlock:^{
[self.delegate webSocket:self didReceiveMessage:message];
}];
}
// Calls block on delegate queue
- (void)_performDelegateBlock:(dispatch_block_t)block;
{
if (_delegateOperationQueue) {
[_delegateOperationQueue addOperationWithBlock:block];
} else {
assert(_delegateDispatchQueue);
dispatch_async(_delegateDispatchQueue, block);
}
}
我的委托实现(本应异步处理的代码)
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message {
//some code to process message
//emulating a long running operation
while(1)
{
}
}
但是当我在我的长 运行ning 操作中放入 dispatch_async 时,UI 不会被阻塞。
是不是因为block整体是运行异步的,但是里面的delegate调用是同步完成的。因此,一旦委托调用结束,_performDelegateBlock returns?
请说明
_delegateDispatchQueue - 默认值将是您的主队列。所以,如果你想 运行 为你的委托异步编码,你需要提供你自己的队列
使用 Socket Rocket 库进行 WebSocket 连接。
当我看到 Socket Rocket 的源代码时,可以清楚地看到它正在使用 dispatch_async
异步调用其委托 class(我的 class)的方法。
但是当在我的 class 中实现委托方法时,我放置了一个无限的 while 循环,UI 被阻塞了。
当委托方法已经被异步调用时,为什么会这样?
SRWebsocket.m
- (void)_handleMessage:(id)message
{
SRFastLog(@"Received message");
[self _performDelegateBlock:^{
[self.delegate webSocket:self didReceiveMessage:message];
}];
}
// Calls block on delegate queue
- (void)_performDelegateBlock:(dispatch_block_t)block;
{
if (_delegateOperationQueue) {
[_delegateOperationQueue addOperationWithBlock:block];
} else {
assert(_delegateDispatchQueue);
dispatch_async(_delegateDispatchQueue, block);
}
}
我的委托实现(本应异步处理的代码)
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message {
//some code to process message
//emulating a long running operation
while(1)
{
}
}
但是当我在我的长 运行ning 操作中放入 dispatch_async 时,UI 不会被阻塞。
是不是因为block整体是运行异步的,但是里面的delegate调用是同步完成的。因此,一旦委托调用结束,_performDelegateBlock returns?
请说明
_delegateDispatchQueue - 默认值将是您的主队列。所以,如果你想 运行 为你的委托异步编码,你需要提供你自己的队列