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

标签 iphone multithreading cocoa xcode concurrency

这个问题是针对那些与我不同的人,真正了解 cocoa 应用程序中的多线程。简要介绍一下情况:

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

1) 我的主视图 Controller 在后台启动一些工作以释放 UI:

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

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

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

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

最佳答案

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

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

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

OS X 上的情况有所不同,OS X 上有更多的内核和可用资源,因此这些数字会随着硬件平台的变化而变化。在 OS X 上,您可以在一个应用程序中成功使用 100 个线程,尽管大多数应用程序需要接近这么多线程的情况并不常见。

关于iphone - 可以从其他后台线程启动后台线程吗? (NSObj),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5001638/

相关文章:

objective-c - 确定设备是否可以振动 - iPhone 与 iPod Touch

iphone - Gamecenter 显示名称在 Release模式下添加了引号

iphone - 使用 NEON 优化 RGBA8888 到 RGB565 的转换

c - 如何让一个线程停止另一个线程?

java - 如何在两个线程之间共享变量

macos - 如何在单击按钮时调出工具提示

ios - Swift 1/2 TextField 标签显示所有名称

c++ - std::async 有什么问题?

cocoa - xcode 4 中 NSWindow 的内容边框

objective-c - 如果我想添加类型化属性,子类化 NSNotification 是正确的途径吗?