ios - 什么队列应该委托(delegate)代码运行

标签 ios objective-c multithreading grand-central-dispatch

假设你有一个对象在私有(private)调度队列上做一些内部工作(对于那些不熟悉 GCD 的人来说想想线程)。该对象在其所做工作的不同时间通知其委托(delegate)人。从代码当前运行的私有(private)队列调用委托(delegate)方法是个坏主意,还是应该在更知名的队列上调用它们?如果是后者,什么队列?似乎主队列可能并不总是你想要的。

选项A

dispatch_async(private_queue, ^{
    // Do some work...
    [self.delegate tellItWorkWasDone:self];
});

选项B

dispatch_async(private_queue, ^{
    // Do some work...
    dispatch_sync(dispatch_get_main_queue(), ^{
        [self.delegate tellItWorkWasDone:self];
    });
});

选项 A 的优点是简单,但缺点是无论谁实现委托(delegate)方法,都将在队列上运行代码,而这些代码实际上不应该在队列上。选项 B 可能更安全,但 main_queue 只是一个例子;两者应该如何真正决定他们应该使用什么队列?

谢谢

最佳答案

我会建议选项 C,实际上:有一个专门的队列用于委托(delegate)回调除非委托(delegate)的事件必须在您的类(class)可以继续之前完成,在这种情况下使用选项 A。

如果 UI 需要更新,代理可以派发到主队列本身,不要强加给它。

关于ios - 什么队列应该委托(delegate)代码运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15941259/

相关文章:

ios - 在断点条件中访问类

ios - 启动时黑屏,但按主页按钮再次进入应用程序时正常

c# - Task.Delay().Wait() 是怎么回事?

iOS 13 提醒应用程序 url 方案不起作用

ios - 无法在 ios 中使用带有自定义按钮的 api v2.4 登录 facebook

ios - 如何捕获完整的 tableView ios 屏幕截图

ios - 区域监控(地理围栏)会消耗电池电量 (iOS)

java - 在 RxJava 流程中添加线程池

c - C 中的链表 - 第一个节点数据不正确,无法弄清楚

ios - 在 IOS 中检索谷歌地图当前位置时隐藏蓝点