【问题标题】:How to execute all methods of an object in a certain queue in ios如何在ios中执行某个队列中对象的所有方法
【发布时间】:2014-06-02 12:18:52
【问题描述】:

对于我的 ios 应用程序,我使用的是主队列和根队列。我有几个对象,我希望他们的方法在根队列中运行。 到目前为止,我一直在做的是每次调用其中一个方法时添加一个 dispatch_async,当我将使用更多队列并想要返回主队列时,这最终会变得非常麻烦。 我正在寻找的是将对象分配给根队列的方法,以便它们的方法在屋顶队列中执行。我的意思是我正在寻找某事。像这样:[[TestClass alloc] initInQueue:testQueue];

【问题讨论】:

    标签: ios queue


    【解决方案1】:

    可以以类似于 KVO 的方式创建它。您可以调整所有方法以将它们包装到 dispatch_* 调用中,但我强烈反对这样做。魔法等级太高了,你几乎肯定会把自己打成结。此外,您不能在dispatch_async 中包装任意方法,因为您无法从中获得返回结果。但是您也不能在dispatch_sync 中包装任意方法,因为您可能会死锁。在我看来,解决一般情况的问题会很快失控。

    您应该问的是您的队列架构是否正确。你真的需要在其他队列上继续调用这么多小方法吗?在许多情况下,最好封装完整的工作单元(即接受输入并生成最终结果的连贯操作序列)而不是单独的方法调用。 (一旦您在工作单元中思考,NSOperation 突然变得更加有用。)虽然将访问器包装到队列中以确保线程安全有时很有用,但这并不是解决并发问题的通用解决方案。

    虽然退出主队列有好处,但不应过度应用此建议。您可以在主队列上完成合理数量的工作而不会出现任何问题。早在 GCD 之前,我们就在 computers less powerful than iPhones 上构建了单线程 Cocoa 应用程序。 (iPhone 可能比我的旧 PowerBooks 更强大,也可能比我原来的 MacBook 更强大。)我不反对在这里排队,只要确保你这样做是出于正确的原因,不要让事情变得过于复杂。

    但是,如果您确实需要移动工作,那么我建议您在方法本身中明确使用 dispatch_ 调用。打字多一点,但更清晰,更不容易出错。

    【讨论】:

    • 感谢您的回答。我真的很喜欢它。
    • 问题是我正在使用由 ios 管理的委托,并且必须在主队列(CBCentralManager 委托)之外的另一个队列中运行。从那里开始,它就会蔓延到其他方法。我的总体想法是让大部分“模型”部分在委托运行的队列中执行,并将主队列用于 gui 部分。
    • 我不明白您所说的“必须在主队列之外的另一个队列中运行”是什么意思。 CBCentralManager 将分派到您请求的任何队列 (initWithDelegate:queue:)。如果你通过nil,它会被调度到主队列。
    • 调度到主队列不会发生,因为其他人在这里报告例如:stackoverflow.com/questions/22412376/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多