30

現在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か?GCDはiPhone向けにリリースされたときの4番目のオプションですが、パフォーマンスが大幅に向上しない限り、ほとんどのプラットフォームで機能する方法を使い続けたいと思います。


@ Jon-Ericのアドバイスに基づいて、NSOperationQueue/NSOperationサブクラスソリューションを使用しました。それは非常にうまく機能します。このNSOperationクラスは十分に柔軟性があるため、必要に応じて、呼び出し、ブロック、またはカスタムサブクラスで使用できます。どのように作成してNSOperationも、実行する準備ができたら、操作キューに入れることができます。操作は、キューに入れるオブジェクトとして機能するように設計されているか、必要に応じてスタンドアロンの非同期メソッドとして実行できます。カスタム操作メソッドを同期して簡単に実行できるため、テストは非常に簡単です。

この質問をして以来、私はいくつかのプロジェクトでこれと同じ手法を使用してきましたが、コードとテストをクリーンで整理され、楽しく非同期に保つ方法に満足することはできませんでした。

A++++++++++再びサブクラス化されます

4

2 に答える 2

33

一般的に、を使用するとマイレージが向上しNSOperationQueueます。

3つの具体的な理由:

  • 一度に多くのアイテムのキャッシュを開始したい場合があります。NSOperationQueueは、コアと同じ数のスレッドのみを作成し、残りの操作をキューに入れるのに十分なほどスマートです。を使用NSThreadすると、100個の画像をキャッシュするために100個のスレッドを作成することは、おそらくやり過ぎであり、やや非効率的です。
  • 操作をキャンセルすることをお勧めしcacheImageます。キャンセルの実装はNSOperationQueue;を使用すると簡単です。ほとんどの作業はすでに完了しています。
  • NSOperationQueue現在または将来、よりスマートな実装(Grand Central Dispatchなど)に自由に切り替えることができます。NSThread常に単なるオペレーティングシステムスレッドである可能性が高くなります。

ボーナス:

  • NSOperationQueue操作の優先順位と依存関係を尊重する洗練された方法など、他にもいくつかの優れた構造が組み込まれています。
于 2010-06-15T02:36:18.553 に答える
5

私は使用しますNSOperationQueue。OS 3.2では、NSOperationQueue内部でスレッドを使用するため、2つの方法は同じように実行されます。ただし、Mac OS 10.6では、NSOperationQueue内部でGCDを使用するため、個別のスレッドのオーバーヘッドがないという利点があります。私はOS4のドキュメントを見ていませんが、似たようなことをしているのではないかと思います。いずれにせよ、NSOperationQueueGCDのパフォーマンス上の利点がiPhoneで利用可能になった場合、実装を入れ替えることができます。

于 2010-06-15T02:22:24.450 に答える