【发布时间】:2013-09-06 19:47:50
【问题描述】:
我正在处理一些无法联系到原始开发人员的代码。
他将一个类的引用传递给另一个类的串行调度队列,我看不出他有什么目的,而不仅仅是创建另一个调度队列(每个类都是一个单例)。
这不会造成问题,但我想进一步了解它,因此感谢您对积极影响的任何见解,谢谢。
编辑:我建议在这里阅读所有答案,它们解释了很多。
【问题讨论】:
标签: ios grand-central-dispatch
我正在处理一些无法联系到原始开发人员的代码。
他将一个类的引用传递给另一个类的串行调度队列,我看不出他有什么目的,而不仅仅是创建另一个调度队列(每个类都是一个单例)。
这不会造成问题,但我想进一步了解它,因此感谢您对积极影响的任何见解,谢谢。
编辑:我建议在这里阅读所有答案,它们解释了很多。
【问题讨论】:
标签: ios grand-central-dispatch
以这种方式共享队列实际上不是一个好主意(不,不是因为它们很昂贵 - 它们不是,恰恰相反)。基本原理是除了队列的创建者之外,任何人都不清楚队列的语义是什么。是串行的吗?同时?高优先级?低优先级?一切皆有可能,一旦您开始传递实际上是为特定类的利益而创建的内部队列,外部调用者可以安排在其上的工作,这会导致相互死锁或以其他方式与其他项目以意想不到的方式表现队列,因为调用者 A 知道会发生并发行为,而调用者 B 认为这是一个串行队列,没有任何并发执行所暗示的“陷阱”。
因此,队列应该尽可能隐藏类的实现细节。该类可以根据需要导出针对其内部队列调度工作的方法,但这些方法应该是唯一的访问器,因为它们是唯一知道如何最好地访问和调度特定类型队列的工作的方法!
【讨论】:
如果它是一个串行队列,那么他们可能打算序列化对共享它的所有对象之间共享的某些资源的访问。
【讨论】:
创建调度队列的成本有点高,而且会占用系统资源。如果您可以共享一个,则系统运行效率更高。就此而言,如果您的应用程序确实在后台运行,则使用共享队列可以让您管理要完成的单个任务池。所以是的,使用共享调度队列是有充分理由的。
【讨论】:
dispatch_queue_t 会占用 128 字节的堆,而您可以在几秒钟内分配 1000 万个。