1

iPadには、3つのステップを順番に実行する必要がある機能があります。たとえば、タスク1、タスク2、タスク3としましょう。Task2 は、サーバーからいくつかのデータをロードする必要があります。そのため、task2 を別のバックグラウンド スレッドに配置する必要があります。

- (IBAction)dbSizeButton:(id)sender {

    //Task1......

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

    dispatch_async(queue, ^{

        //Task2 .....which go to server and download some stuff and update database.

        dispatch_sync(dispatch_get_main_queue(), ^{
            //Task3, continue to work on UI
        });
    });
}   

しかし、Task2 の開始時にアプリが強制終了されることがよくあるようです。正確な理由はわかりません。Task2 が別のスレッドで実行されていることがわかります。それで、GCDを使用する代わりに、それがそれを行う方法ではない場合、Task2の最後にメッセージまたは通知をメインスレッドに送信して、Task3を開始できるかどうか疑問に思っていますか? それをどのように正確に行うのですか?

4

2 に答える 2

5

問題はdispatch_sync、ブロックする の使い方だけです。それがあなたが殺されている理由です。あなたはほとんどそれを正しく持っていました。あなたが望むものは:

// ... task 1 on main thread
dispatch_async(other_queue, ^{
    // ... task 2 in background thread
    dispatch_async(dispatch_get_main_queue(), ^{
        // ... task 3 on main thread
    });
});

これは、本筋から離れて本筋に戻るための標準的なパターンです。それだけです!

于 2012-10-26T03:57:39.440 に答える
2

達成したいことは、GCD の代わりに NSOperation と NSOperationQueue を使用することで簡単に実行できます。通知は発生しませんが、やりたいことはできると思います。

あなたの問題を正しく理解している場合、あなたは現在メインスレッドで task1 を実行しています。Task2 は後で task1 を介して同時に起動されますが、task2 は task3 に UI を呼び出すように指示します。つまり、タスク 2 とタスク 3はタスク 1に依存していますね。

NSOperations (操作とは、別のスレッドで実行できるセレクターまたはブロックのコードの一部です) と NSOperationQueues を使用すると、これらの依存関係を 1 分未満で実現できます。

//Assuming task1 is currently running.
NSOperationQueue *downloadAndUpdate; //Leaving out initialization details.

NSOperationBlock *task2; //Leavign out initialization details.
NSOperationBlock *task3;

//This is where it gets interesting. This will make sure task3 ONLY gets fired if task2 is finished executing.
[task3 addDependency:task2];

//Task3 could have the following code to update the main thread.

[[NSOperationQueue mainQueue] addOperation:myUIUpdatingTask];

これらの API は GCD よりも高いレベルにあるため、それらを使用してより優れた同時実行性を実現する方法を学ぶことを強くお勧めします。

これらの API を使い始めるのに役立つチュートリアルを次に示します。

(開示: 私はこの投稿の著者ですが、私の意図は自分の作品を宣伝することではないことを約束します。私がこのチュートリアルを書いたのは、GCD よりも並列処理を行うためのより良い方法が必要であり、最終的にこれを学ぶことになったからです。私は教えることが好きです。私が学んだこと)。

于 2012-10-26T02:42:27.003 に答える