我正在编写一个中等复杂的iOS程序,它需要有多个线程来执行一些较长的操作(解析、网络连接等等).然而,我对dispatch_get_global_queuedispatch_queue_create之间的区别感到困惑.

我应该使用哪一种?你能简单解释一下两者的区别吗?谢谢

推荐答案

正如documentation所描述的,如果不想遇到创建和销毁自己的队列的理论开销,全局队列适合并发任务(即,您将异步调度各种任务,如果它们同时运行,您会非常满意).

如果需要串行队列(即需要一次执行一个已调度的块),那么创建自己的队列非常有用.这在许多情况下都很有用,例如当每个任务依赖于前一个任务时,或者当协调与来自多个线程的共享资源的交互时.

不太常见,但如果需要将barriers与并发队列结合使用,还需要创建自己的队列.在这种情况下,创建一个并发队列(即dispatch_queue_createDISPATCH_QUEUE_CONCURRENT选项),并将屏障与该队列结合使用.你不应该在全球排队时使用障碍物.

我的总建议是,如果你需要一个串行队列(或者需要使用屏障),那么就创建一个队列.如果没有,请继续使用全局队列,绕过创建自己队列的开销.


如果你想要一个并发队列,但是想要控制多个操作可以同时运行,你也可以考虑使用具有NSOperationQueue属性的maxConcurrentOperationCount.这在执行网络操作时非常有用,而且您不希望向服务器提交太多并发请求.

Objective-c相关问答推荐

Objective-C NSMutableArray 在枚举时发生了变异?

Objective-C 中的实例变量是否默认设置为 nil?

如何声明仅调试语句

KVO - 如何判断对象是否是观察者?

如何从 Appdelegate 显示 UIAlertController

处理 ARC 中的指针对指针所有权问题

iOS中CALayer的UIImage

如何以编程方式退出 mac 应用程序?

dispatch_get_global_queue vs dispatch_get_main_queue

Xcode:可以为协议接口所需的方法自动创建存根吗?

如何从 AVPlayer(不是 AVAudioPlayer)获取持续时间?

在不导入自己的情况下播放系统声音

Objective-C:块 vs. Select 器 vs. 协议

AdMob 因 [GADObjectPrivate changeState:] 崩溃:无法识别的 Select 器

UITextField:键盘出现 timeshift 动视图

通过索引访问 NSMutableDictionary 中的对象

iOS是静态框架还是动态框架?

Highlighted 和 Selected UIButton 的 State 有什么区别?

BOOL到 NSString

将 Xcode 组创建为文件系统文件夹的工作流程