0

使用 Socket Rocket 库进行 WebSocket 连接。

当我看到 Socket Rocket 的源码时,可以清楚地看到它正在异步调用它的委托类(我的类)的方法dispatch_async

但是,当在我的类中实现该方法的委托时,我放了一个无限的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)
{
}


}

但是当我在长时间运行的操作中放置一个 dispatch_async 时,UI 不会被阻塞。

是不是因为整个块是异步运行的,但其中的委托调用是同步完成的。那么,一旦委托调用结束,_performDelegateBlock 会返回吗?

请解释

4

1 回答 1

2

_delegateDispatchQueue - 默认值将是您的主队列。所以,如果你想为你的委托异步运行代码,你需要提供你自己的队列

于 2015-07-02T17:19:27.797 回答