可以从其他后台线程启动后台线程吗? (NSObj)

时间:2011-02-15 09:10:33

标签: iphone multithreading cocoa xcode concurrency

这个问题适合那些与我不同的人,真正了解可可应用程序中的多线程。简而言之,就是这种情况:

情况:
我的应用程序通过使用NSObject中提供的方法实现并发。请告诉我是否可以执行以下操作:

1)我的主视图控制器在后台启动一些工作来释放UI:

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

2)后台工作将其任务划分为更多后台线程上的几个较小任务,以便每个任务在完成时更新(而不是在所有任务完成时):

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

如果你去操作队列而不是从另一个后台线程产生线程,那就更好了。