41

私はNSOperation、iPhoneがアプリケーションで使用するのに理想的なツールである場合の具体的なシナリオをいくつか探していました。私の理解では、これは独自のthreadedコードを書くためのラッパーです。私はそれを使っているAppleデモアプリを見たことがないので、を使う代わりに素晴らしいツールを見逃しているのではないかと思っていNSThreadます。

ここでの理想的な解決策はNSOperation、問題を解決するためのユースケースシナリオとそれをどのように使用するかを説明することです。

4

7 に答える 7

43

Cocoa Is My Girlfriendには、との使用に関する優れたチュートリアルNSOperationがありNSOperationQueueます。このチュートリアルでは、NSOperation複数のWebページを別々のスレッドで同時にダウンロードするために使用します。

また、MacResearchのこの記事も参照してください。

于 2009-05-06T18:26:05.933 に答える
33

iPhone アプリでこれを使用する方法は、基本的に、アプリケーション デリゲートで NSOperationQueue メンバーを作成し、プロパティを通じて使用できるようにすることです。次に、バックグラウンドで何かを実行する必要があるたびに、たとえば XML をダウンロードするたびに、NSInvocationOperation を作成してキューに送信します。

NSInvocationOperation *operationToPerform = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateXML) object:nil];
[[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] sharedOperationQueue] addOperation:operationToPerform];
[op release];
于 2009-05-07T08:57:07.040 に答える
10

一言で:NSOperationQueue

NSOperationQueueスレッドセーフであり(ロックを必要とせずに異なるスレッドから操作を追加できます)、NSOpオブジェクトをチェーン化できます。

私のFlickriPhoneアプリ、Reflectionsは、画像のダウンロードとを管理するためNSOperationに広範囲に使用しています。NSOperationQueueXML

警告:ドキュメントが「並行性」について話しているときは、ドキュメントの意味を読み、読み直し、理解してください。

于 2009-05-07T00:58:12.090 に答える
6

次のURL も確認してください: http://developer.apple.com/cocoa/managingconcurrency.html

上記の回答はすべて素晴らしいですが、上記の記事を読んで、コードでこの行を自由に使用してください。

if ( self.isCancelled ) return;

その行は、Coca is my Girlfriend が提供するサンプルでは使用されませんでした。フィールドからクラッシュ ログを取得するまで、これが問題/概念であることに気付きませんでした。

于 2011-06-09T01:38:25.470 に答える
5

これは非常に単純な実装ですが、時間をかけてチュートリアルを読んですべてを完全に理解してください。

NSOperationQueue *queue = [NSOperationQueue new];

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
    selector:@selector(methodToCall)
    object:objectToPassToMethod];

[queue addOperation:operation];
于 2013-03-27T19:54:23.807 に答える
1

非同期処理に使用します。これは、Web サービスからデータを取得したり、実行にかなりの時間がかかるアクションを調整したりするための最良の方法です。これらはスレッド セーフで非同期 (メイン スレッドを拘束しない) であり、依存関係をサポートしているため、ツールセットにとって非常に優れたツールです。

依存関係により、いくつかの個別の操作を行い、実行と成功またはエラーが特定の順序で行われることを確認できます。これは、大量のデータを同期する必要があるが、子オブジェクトを同期する前に親オブジェクトを同期する必要がある場合に非常に便利です。

于 2013-05-21T22:04:48.587 に答える
1

Swiftを使って試せるサンプル

let operation : NSOperation = NSOperation()
operation.completionBlock = {
println("Completed")
}

let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(operation)
于 2014-07-27T19:02:32.240 に答える