2

次のコードを使用してタスクを実行しています。

mTimerForImageUpload = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
if (mTimerForImageUpload) {
    dispatch_source_set_timer(mTimerForImageUpload, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * uploadCheckInterval), NSEC_PER_SEC * uploadCheckInterval, leeway);
    dispatch_source_set_event_handler(mTimerForImageUpload, ^{
        [self uploadData];
    });
    dispatch_resume(mTimerForImageUpload);
}

uploadData基本的に、メソッドのインスタンスを同時に 1 つだけ実行したいと考えています。つまり、タスクがまだ実行されている場合、新しいスレッドを実行したくありませんが、完了するまで待ちたいと思います。

これを行う方法はありますか?

4

1 に答える 1

4

GCD とブロック自体はこれをサポートしていませんが、機能させることができます。

ブロックが開始時に自分自身を追加し、終了したときに自分自身を削除する可変セットを持つか (つまり、最初と最後のこと)、より高い抽象化 (NSOperation) に進むことができます。

実行中のブロックを自分で追跡する

ブロック自体 (またはアップロードしているリソースなどの一意のキー) を変更可能なセットに追加すると、そのセットをクエリして、そのリソースが既にアップロードされているかどうかを確認できます[runningBlocksSet containsObject:myNewBlockForResoucreThatImAboutToUpload](非常に長い変数名で申し訳ありません)。

NSOperationかどうかを確認するために使用isExecuting

反対側でアップロードを行う代わりに NSOperations を使用することを選択した場合、それらは を使用して実行されているかどうかのチェックを既にサポートしてい[myUploadOperation isExecuting]ます。また、キャンセルされたか、終了したか、または準備ができているかどうかを確認することもできます (操作には依存関係があり、依存するすべての操作が完了するまで実行する準備ができていません)。

于 2012-07-15T15:04:37.883 に答える