NSOperation
サブクラス(PointsOperation)を使用して、アプリのバックグラウンドで計算を実行しています。ユーザーの動作により、これらの計算をキャンセルし、新しい計算を開始する必要があります。その場合は、新しいPointsOperation
インスタンスを作成し、最初のインスタンスと同じNSOperationQueue
に追加します。 PointsOperationのメインメソッドの最初のものとして、別の操作が既に実行されているかどうかを確認し、取り消します。NSOperation waitUntilFinishedが長時間待機する
操作で共有キャッシュが使用されているため、並列に実行する必要はありません(実行する必要はありません)。したがって、2番目の操作は、最初の操作が完了するまで待機します。メインメソッドの結果のコードは次のようなものになります。
static NSOperation *currentOperation = nil;
- (void) main
{
// setting up autorelease pool, catching exceptions, etc
@synchronized(lock) {
if (currentOperation != nil) {
[currentOperation cancel];
[currentOperation waitUntilFinished];
}
currentOperation = self;
}
while (!calculationsFinished && ![self isCancelled]) {
// do calculations
}
currentOperation = nil;
// releasing autorelease pool, etc
}
このすべてが正常に動作しますが、最初の操作が取り消され、それが終了するのを秒待ち、その後、計算を開始します。
問題は、メインメソッドを終了する最初の操作と、waitUntilFinished
から2番目の操作が終了するまでに3〜10秒かかることです。
誰もこれを前に見て、それについて何をすべきかを知っていますか?
また、waitUntilFinished
の代わりに、2番目の操作を最初の操作に依存させて、 "addDependency:"(メインではなくinitメソッドで)を試みました。これもうまくいきますが、同じ問題があります。第2の操作の開始は、最初のメソッドの終了の数秒です。
答えをありがとう。上のコードと説明でわかるように、私はisCancelledをチェックします。また、キャンセルの結果、操作が終了したことと、最初の操作のメインメソッドの終了とwaitUntilFinishedからの2番目の操作の間に遅延があることを確認しました。 – fishinear
@fishinear私はそれを忘れてしまって残念です:( – tia
あなたを変えるつもりはありませんが、 '[currentOparation waitUntilFinished]'行の変数のスペルが間違っていて、まだコンパイルされていますか? – tia