2011-07-22 4 views
2

私はNSOperationをNSOperationQueueで実行しています。 NSOperationはいくつかのデータをダウンロードし、NSDictionaryに解析します。 NSOperationがいつ終了し、その辞書を入手するのかを私はどのように知っていますか?おかげさまで NSOperation finished

答えて

0

通常は、操作が完了したことを知る必要があるオブジェクトをNSOperationメソッドで呼び出すことです。あるいは、NSNotificationCenterを使用して、さまざまなオブジェクトがより分散的な方法で更新をリッスンできるようにすることができます。または、NSOperationのisFinishedプロパティでKVOを聞くことができます。

0

NSOperationをデリゲートで初期化することをお勧めします。 NSOperationが仕事を終えると、彼はデリゲートのメソッド(プロトコルで宣言されている)を使ってデリゲートを呼び出します。

+0

返信いただきありがとうございます。私はこの操作が別のスレッドにあるので動作しないと思いましたが、これを試してみましょう。 – user635064

+0

あなたは別のスレッドにいるという事実に問題はありません。あなたのメッセージはあなたの代理人に届きます。 –

5

またNSOperation- (void)setCompletionBlock:を使用することができます。

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"Doing something..."); 
}]; 

[operation setCompletionBlock:^{ 
    NSLog(@"Doing something once the operation has finished..."); 
}]; 

[queue addOperation:operation]; 

多くの詳細hereを。

+0

完了ブロックがどのスレッドで実行されるかについては、(1)と(2)の保証がないことに注意することが重要です。ドキュメンテーションは、これらの問題をより詳細に説明します。もちろん、完了ブロックは、操作が終了した後に実行されます。それが実行される正確な瞬間(順序)は不確実です。 –

1

自体NSOperationで操作が終了したときに知っておく必要のあるコードのブロックは、その後、あなたは優雅にそれらの間の依存関係を確立することにより、これを扱うことができる場合:

[laterOp addDependency:downloadAndParseOp]; 
laterOpは後にのみ実行されます

downloadAndPareOpが終了しました。

実際、このアプローチが可能なようにコードを記述することをお勧めします。 NSOperationsとNSOperationQueueの最大の強みの1つは、コード実行を容易に調整できることです。

+0

ダウンロードの最大の問題は、NSURLSessionを使用している場合、操作が非同期になることです。すなわち操作が完了し、しばらくしてダウンロードが完了する。回避策:NSURLSessionを同期化するか、NSOperationをサブクラス化して、ダウンロードが完了した後に 'isFinished'を設定するだけです。 –