gpt4 book ai didi

ios - GCDAsyncSocket 在接收数据时卡住 UI

转载 作者:行者123 更新时间:2023-11-29 10:31:09 26 4
gpt4 key购买 nike

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

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

现在,一切正常,发送和接收工作正常。但是,如果套接字非常快地接收到大量数据(例如来自服务器的“for 循环”的 1000 条左右消息),应用程序的 UI 会卡住,直到它接收到所有数据(尽管接收到的消息中没有错误) .

那么我需要更改什么才能不让 UI 卡住?是不是因为用的是“dispatch_get_main_queue()”,需要用别的队列吗?如果是这样,我应该怎么做?还是我使用线程或类似的东西?

最佳答案

尝试创建你自己的并发串行后台队列(结果你不允许使用并发队列),例如

dispatch_queue_t queue = dispatch_queue_create("com.yourid.queue", DISPATCH_QUEUE_SERIAL);
self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue: queue];

或者,您可以传递“NULL”,GCDAsyncSocket 将创建自己的队列。

这应该会在后台队列中调用委托(delegate)方法,并有望阻止您的 UI 卡住。这里要注意的重要一点是,你不能在后台队列中更新 UI 元素,所以你必须在你的委托(delegate)方法中做这样的事情:

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

(希望我没记错)

关于ios - GCDAsyncSocket 在接收数据时卡住 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29565466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com