GCDAsyncSocket在接收数据时冻结UI

时间:2015-04-10 15:39:27

标签: ios objective-c sockets grand-central-dispatch gcdasyncsocket

我是GCD原则和GCDAsyncSocket的新手,但我在我的项目中使用它。我用AppDelegate初始化GCD套接字:

self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

现在,一切运行良好,发送和接收工作正常。但是,如果套接字非常快地接收大量数据(例如来自服务器的'for循环'的1000条消息),应用程序的UI会冻结,直到它收到所有内容(尽管收到的消息中没有错误)

那么我需要更改为不让UI冻结?是因为它使用“dispatch_get_main_queue()”,我是否需要使用另一个队列?如果是的话,我应该怎么做呢?或者我使用线程或类似的东西?

1 个答案:

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

(我希望我能正确记住这一点)