kub*_*ubi 29 iphone nsthread nsoperationqueue grand-central-dispatch
目前我正在使用NSThread另一个线程缓存图像.
[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image];
Run Code Online (Sandbox Code Playgroud)
交替:
[self performSelectorInBackground:@selector(cacheImage:) withObject:image];
Run Code Online (Sandbox Code Playgroud)
或者,我可以使用 NSOperationQueue
NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cacheImage:) object:image];
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
[opQueue addOperation:invOperation];
Run Code Online (Sandbox Code Playgroud)
有没有理由改变NSThread?GCD是iPhone上发布的第四个选项,但除非有显着的性能提升,否则我宁愿坚持使用适用于大多数平台的方法.
根据@ Jon-Eric的建议,我选择了NSOperationQueue/ NSOperation子类解决方案.它工作得很好.该NSOperation班是足够灵活,你可以调用,块或定制子类使用它,这取决于你的需求.无论您如何创建自己,NSOperation都可以在准备运行时将其放入操作队列中.如果需要,这些操作可以作为您放入队列的对象,也可以作为独立的异步方法运行.由于您可以轻松地同步运行自定义操作方法,因此测试非常简单.
我在一些项目中使用了相同的技术,因为我问了这个问题,我对它保持我的代码和我的测试干净,有条理和快乐异步的方式感到高兴.
A +++++++++++++++++++++++++
Jon*_*ric 32
一般来说,你会获得更好的里程NSOperationQueue.
三个具体原因:
NSOperationQueue足够聪明,只能创建与核心一样多的线程,对剩余的操作进行排队.使用NSThread,创建100个线程来缓存100个图像可能是过度杀伤并且效率低下.cacheImage操作.实施取消更容易NSOperationQueue; 大多数工作已经完成了.NSOperationQueue现在或将来可以自由切换到更智能的实施(如Grand Central Dispatch).NSThread更可能永远只是一个操作系统线程.奖金:
NSOperationQueue 内置了一些其他好的构造,例如尊重操作优先级和依赖关系的复杂方法.我会用NSOperationQueue.在OS 3.2下,NSOperationQueue使用引擎盖下的线程,因此这两种方法应该执行类似的操作.但是,在Mac OS 10.6 NSOperationQueue下,在引擎盖下使用GCD,因此具有不具有单独线程开销的优点.我没有看过OS 4的文档,但我怀疑它有类似的东西 - 无论如何,NSOperationQueue如果/当GCD的性能优势可用于iPhone时可以交换实现.
| 归档时间: |
|
| 查看次数: |
13160 次 |
| 最近记录: |