好吧,从其他后台线程启动后台线程? (NSObj)

问题描述:

这个问题对于那些和我不同的人来说,真的是了解可可应用程序中的多线程。这里有一个简单的情况是:好吧,从其他后台线程启动后台线程? (NSObj)

现状:
我的应用程序通过使用NSObject的提供的方法实现了并发性。请告诉我,如果它是好的,做到以下几点:

1)我的主视图控制器启动在后台的一些工作,以腾出UI:

​​

2)背景的工作把它的任务分成更多的后台线程几个较小的任务,以便为它完成每个任务被更新(而不是当所有任务完成):

[self performSelectorInBackground:@selector(loadOneImage:) withObject:nil]; 

理由:
这是我可以发明的唯一方法来完成单个任务(加载/绘制自定义UIViews)在UI中更新的每个完成。否则,当组中最后一项任务完成时,所有任务才会更新...

是的,您可以使用performSelectorInBackground:...调用来从辅助线程产生辅助线程。

如果你有很多线程产生(以这种方式),请考虑一个NSOperationQueue。否则,你可能会得到大量的后台线程。 100个线程(例如),每个在移动设备中加载一个图像都不是很好的资源利用 - 也不会对其进行响应。 NSOperationQueue允许您限制最大数量的线程/工作者,并重用工作者线程。

注意:'100线程'被使用,因为这个数字远远超出了硬件的逻辑(这个问题被标记为iPhone)。如果你的图像加载全部在内存中,只需使用一个序列(一次一个工作人员)NSOperationQueue - NSOperations可以指定优先级。如果图像正在被下载,那么你可能想要坚持到4或更少。

OS X上的情况有所不同,因为OS X上有更多可用的内核和资源,所以这些数字会随着硬件平台的变化而变化。在OS X上,您可以在一个应用程序中成功使用100个线程,不过在大多数应用程序的多线程附近需要任何东西是不寻常的。

+0

感谢您的支持。次要线程方法现在工作正常,但同时发生了很多事情 - 这使我的UI有点呆滞。所以我会研究NSOperationQueue,看看它是否有什么不同。 – m0rtimer 2011-02-15 09:27:26

就我所见,这种方法没有任何问题。根据文档,performSelectorInBackground:withObject:只是产生另一个线程,并在那里执行你的选择器。它没有列出任何限制。只要不要忘记在通过performSelectorInBackground:withObject:调用的每种方法中设置自动释放池,以避免泄漏任何内存。

+0

感谢您的回答Darkdust。很高兴知道我还在安全区。尽管如此,我仍然需要检查NSOperationQueue是否提供了真正的性能优势。 – m0rtimer 2011-02-15 09:25:07

你应该确定一个关键条件。两个在后台运行的线程都不应该有任何依赖关系。如果他们有,那么你最终可能会不一致。

因此,如果你去操作队列,而不是从另一个后台线程产生线程,