对于我的ios应用,我正在使用主队列和根队列。我有几个对象,我希望他们的mehtods在根队列中运行。
到目前为止,我一直在做的是每次调用其中一个方法时添加一个dispatch_async,当我将使用更多队列并想要返回主队列时最终会变得非常麻烦。
我正在寻找的是将对象分配给根队列的方法,以便他们的方法在屋顶队列中执行。我的意思是我正在寻找某事。像这样:[[TestClass alloc] initInQueue:testQueue];
答案 0 :(得分:0)
可以以类似于KVO的方式创建它。您可以调整所有方法将它们包装到dispatch_*
个调用中,但我强烈反对它。魔法的程度太高了,你几乎肯定会把自己绑在一起。此外,您无法在dispatch_async
中包含任意方法,因为您无法从中获得返回结果。但是你也不能在dispatch_sync
中包装任意方法,因为你可能会陷入僵局。在我看来,解决一般情况的问题很快就会失控。
您应该问的是您的队列架构是否正确。你真的需要继续在其他队列上调用这么多小方法吗?在许多情况下,最好封装整个工作单元(即采用输入并产生最终结果的连贯操作序列)而不是单独的方法调用。 (一旦你在工作单元中思考,NSOperation
突然变得更有用。)虽然将访问器包装到队列中以获得线程安全性有时是有用的,但这不是并发的通用解决方案。
虽然离开主队列有好处,但这个建议不应该被过度应用。您可以在主队列上进行大量合理的工作而不会出现任何问题。早在GCD之前,我们就在computers less powerful than iPhones上构建了单线程Cocoa应用程序。 (iPhone可能比我原来的PowerBook更强大,并且可能比我原来的MacBook更强大。)我不会在这里阻止排队,只是确保你出于正确的原因而做了这件事,并且不要过度复杂化。
但是如果你真的需要移动工作,那么我建议在方法本身中明确地使用dispatch_
调用。它打字更多一点,但它更清晰,更不容易出错。