目前我正在使用 NSThread
在另一个线程中缓存图像。
[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image];
或者:
[self performSelectorInBackground:@selector(cacheImage:) withObject:image];
或者,我可以使用 NSOperationQueue
NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cacheImage:) object:image];
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
[opQueue addOperation:invOperation];
有什么理由要放弃 NSThread
吗?当它针对 iPhone 发布时,GCD 是第四个选项,但除非有显着的性能提升,否则我宁愿坚持使用适用于大多数平台的方法。
根据 @Jon-Eric 的建议,我采用了 NSOperationQueue
/NSOperation
子类解决方案。它运作得很好。 NSOperation 类非常灵活,您可以根据需要将其与调用、 block 或自定义子类一起使用。无论您如何创建 NSOperation,当您准备好运行它时,您都可以将其放入操作队列中。这些操作被设计为可以作为放入队列的对象来工作,也可以根据需要将它们作为独立的异步方法运行。由于您可以轻松地同步运行自定义操作方法,因此测试非常简单。
自从我提出这个问题以来,我在几个项目中使用了同样的技术,我对它保持我的代码和测试干净、有组织和异步的方式感到非常满意。
A++++++++++ 将再次子类化
最佳答案
一般来说,使用 NSOperationQueue
会获得更好的效果。
三个具体原因:
- 您可能希望一次启动多个项目的缓存。
NSOperationQueue
足够智能,只创建与核心数量相同的线程,并对剩余的操作进行排队。使用NSThread
,创建 100 个线程来缓存 100 个图像可能有点矫枉过正,而且效率有些低下。 - 您可能想要取消
cacheImage
操作。使用 NSOperationQueue 实现取消更容易;大部分工作已经为您完成。 NSOperationQueue
现在或将来可以自由切换到更智能的实现(例如 Grand Central Dispatch)。NSThread
更有可能始终只是一个操作系统线程。
奖金:
NSOperationQueue
还内置了一些其他不错的构造,例如尊重操作优先级和依赖性的复杂方法。
关于iphone - NSThread vs. NSOperationQueue vs. ???在 iPhone 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3041837/