Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否有任何理由共享调度队列?_Ios_Grand Central Dispatch - Fatal编程技术网

Ios 是否有任何理由共享调度队列?

Ios 是否有任何理由共享调度队列?,ios,grand-central-dispatch,Ios,Grand Central Dispatch,我正在编写一些无法联系原始开发人员的代码 他将一个类a引用传递给另一个类的串行调度队列,我看不出他有什么目的,不仅仅是创建另一个调度队列(每个类都是单例的) 这不是在制造问题,但我想进一步了解,因此,我们非常感谢您对积极影响的任何见解,谢谢 编辑:我建议阅读这里的所有答案,它们解释了很多。调度队列的创建成本有点高,并且占用了系统资源。如果您可以共享一个,系统运行效率会更高。因此,如果您的应用程序确实在后台工作,那么使用共享队列可以管理要完成的单个任务池。因此,使用共享调度队列是有充分理由的。如果

我正在编写一些无法联系原始开发人员的代码

他将一个类a引用传递给另一个类的串行调度队列,我看不出他有什么目的,不仅仅是创建另一个调度队列(每个类都是单例的)

这不是在制造问题,但我想进一步了解,因此,我们非常感谢您对积极影响的任何见解,谢谢


编辑:我建议阅读这里的所有答案,它们解释了很多。

调度队列的创建成本有点高,并且占用了系统资源。如果您可以共享一个,系统运行效率会更高。因此,如果您的应用程序确实在后台工作,那么使用共享队列可以管理要完成的单个任务池。因此,使用共享调度队列是有充分理由的。

如果它是一个串行队列,那么他们可能打算序列化对共享它的所有对象之间共享的某些资源的访问。

以这种方式共享队列实际上不是一个好主意(不,不是因为它们很昂贵-它们不是,恰恰相反)。其基本原理是,除了队列的创建者之外,任何人都不清楚队列的语义是什么。是连续剧吗?同时发生的高优先级?低优先级?所有这些都是可能的,一旦您开始传递内部队列,这些队列实际上是为特定类的利益而创建的,外部调用方可以对其安排工作,这会导致相互死锁,或者以意外的方式与该队列上的其他项一起工作,因为调用方a知道会出现并发行为,而调用方B认为这是一个串行队列,没有并发执行所暗示的任何“陷阱”


因此,队列应该尽可能隐藏类的实现细节。该类可以根据需要导出方法,以便根据其内部队列安排工作,但这些方法应该是唯一的访问器,因为它们是唯一知道如何在特定类型的队列上以最佳方式访问和安排工作的方法

我对GCD的了解参差不齐(我正在尽可能快地阅读以纠正这一点),但为什么一个队列比两个队列运行得更好?我不同意队列创建“昂贵”和“占用(大量)系统资源”。调度队列和内核互斥体或类似的东西之间没有1:1的关系。根据经验,我观察到分配一个
dispatch\u queue\t
需要128字节的堆,您可以在几秒钟内分配1000万字节。谢谢,是的,这是一个串行队列(我编辑了问题以反映这一点)这是我在旅行中看到的共享串行队列的最常见原因。如果不是串行队列呢?IMHO,如果需要公开队列,则应该由调用站点执行完成处理程序或进度处理程序。关联异步任务的工作负载应该在它们自己的私有队列上执行。在我看来,OPs描述是一种潜在的代码味道。我认为共享并发队列可以用于其暂停语义,但这是非常不寻常的。我同意这可能不是最好的方法。哇,非常感谢你的书面回复。这里有很多有用的答案,但为了推广最佳实践,我认为你的答案是正确的。