我是GCD原则和GCDAsyncSocket的新手,但我在我的项目中使用它。我用AppDelegate初始化GCD套接字:
self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
现在,一切运行良好,发送和接收工作正常。但是,如果套接字非常快地接收大量数据(例如来自服务器的'for循环'的1000条消息),应用程序的UI会冻结,直到它收到所有内容(尽管收到的消息中没有错误)
那么我需要更改为不让UI冻结?是因为它使用“dispatch_get_main_queue()”,我是否需要使用另一个队列?如果是的话,我应该怎么做呢?或者我使用线程或类似的东西?
答案 0 :(得分:2)
尝试创建自己的并发串行后台队列(原来不允许使用并发队列),例如
dispatch_queue_t queue = dispatch_queue_create("com.yourid.queue", DISPATCH_QUEUE_SERIAL);
self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue: queue];
或者你也可以通过' NULL'和GCDAsyncSocket将创建自己的队列。
这应该在后台队列中调用委托方法,并希望阻止UI冻结。这里需要注意的重要一点是,您无法在后台队列中更新UI元素,因此您必须在委托方法中执行以下操作:
- (void)socket:(GCDAsyncSocket *)sender didConnectToHost:(NSString *)host port:(UInt16)port
{
//Do some calculations (in background queue)
dispatch_async(dispatch_get_main_queue(), ^{
//Update UI elements (in main queue)
});
}
(我希望我能正确记住这一点)