ios - Socket Rocket 异步委托(delegate)方法

标签 ios asynchronous delegates socketrocket

使用 Socket Rocket 库进行 WebSocket 连接。

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

但是当在实现委托(delegate)方法的类中放置一个无限循环时,UI 会被阻塞。

为什么委托(delegate)方法已经被异步调用了呢?

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);
}
}

我的委托(delegate)实现(本应异步处理的代码)

- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message {

//some code to process message

//emulating a long running operation
while(1)
{
}


}

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

是不是因为block整体是异步运行的,但是里面的delegate调用是同步完成的。那么,一旦委托(delegate)调用结束,_performDelegateBlock 就会返回吗?

请解释

最佳答案

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

关于ios - Socket Rocket 异步委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31186694/

相关文章:

ios - 如何在没有 Tab 或 Nav Controller 的情况下使用 Storyboard 从 AppDelegate 实例化不同的 View ?

ios - 如何创建到 SKAction 的过渡?

ios - MagicalRecord 不保存新对象

C#异步对象

c# - 从 Action<T> 的实例中获取 Invoke MethodInfo 的最安全方法

ios - 释放一个整数?

spring - 需要帮助解决 Spring 应用程序中使用 Tomcat 的异步支持启用问题

java - GORM 对象关系未加载到异步 block 中

C# - 事件关键字的优势?

c# - 带有 ASP.NET MVC 的 C# 中的通知系统/服务