套接字Rocket异步委托方法

时间:2015-07-02 14:00:56

标签: ios asynchronous delegates socketrocket

使用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就会返回?

请解释

1 个答案:

答案 0 :(得分:2)

_delegateDispatchQueue - 您的主要队列的默认值。因此,如果要为代理异步运行代码,则需要提供自己的队列