質問

現在、私は使用しています NSThread 別のスレッドで画像をキャッシュするには。

[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image];

代わりに:

[self performSelectorInBackground:@selector(cacheImage:) withObject:image];

あるいは、Anを使用できます 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 ++++++++++は再びサブクラスになります

役に立ちましたか?

解決

一般に、より良い走行距離が得られます NSOperationQueue.

3つの具体的な理由:

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

ボーナス:

  • NSOperationQueue 操作の優先順位と依存関係を尊重する洗練された方法など、他の素晴らしいコンストラクトが組み込まれています。

他のヒント

私は使うだろう NSOperationQueue. 。 OS 3.2の下で、 NSOperationQueue フードの下にスレッドを使用するため、2つの方法も同様に実行する必要があります。ただし、Mac OS 10.6では NSOperationQueue フードの下でGCDを使用するため、個別のスレッドのオーバーヘッドがないという利点があります。私はOS 4のドキュメントを見ていませんが、それはどんな場合でも似ていることをしているのではないかと疑っています。 NSOperationQueue iPhoneでGCDのパフォーマンスの利点が利用可能になった場合/時に実装を交換できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top