1

いくつかのアクション セットがありますが、各アクションは非同期 API を呼び出します。Async API が戻るまで待ってから、2 番目のアクションの実行を開始します。

例: X、Y、および Z アクションがあります。メソッド 1 は X アクションを実行し、メソッド 2 は Y アクションを実行し、メソッド 3 は Z アクションを実行します。ここで、Method1 は内部的に Async API を呼び出します。したがって、Method1 が完了するまで Method2 を呼び出したくありません。

method1 ()

// Here wait till method1 complete 

method2 ()

// Here wait till method12 complete 

method3 () 

method 1 
{
    block{
             // This block will be called by Async API 
          };

   // here invoking Async API
}

method1 が完了するまで待機するために使用できるもの。Objective-C のどのメカニズムがより効率的ですか? 前もって感謝します

4

2 に答える 2

0

dispatch_semaphore_tブロック (非同期完了ブロック) の最後で通知するを使用できます。さらに、メソッド 1、メソッド 2、メソッド 3 が常に順番に呼び出される場合は、セマフォを共有する必要があり、すべてを単一のメソッドとして移動します。これを行う方法の例を次に示します。

- (void) method123
{
    dispatch_semaphore_t waitSema = dispatch_semaphore_create(0);

    callAsynchAPIPart1WithCompletionBlock(^(void) {
        // Do your completion then signal the semaphore
        dispatch_semaphore_signal(waitSema);
    });

    // Now we wait until semaphore is signaled.
    dispatch_semaphore_wait(waitSema, DISPATCH_TIME_FOREVER); 

    callAsynchAPIPart2WithCompletionBlock(^(void) {
        // Do your completion then signal the semaphore
        dispatch_semaphore_signal(waitSema);
    });

    // Now we wait until semaphore is signaled.
    dispatch_semaphore_wait(waitSema, DISPATCH_TIME_FOREVER); 

    callAsynchAPIPart3WithCompletionBlock(^(void) {
        // Do your completion then signal the semaphore
        dispatch_semaphore_signal(waitSema);
    });

    // Now we wait until semaphore is signaled.
    dispatch_semaphore_wait(waitSema, DISPATCH_TIME_FOREVER); 

    dispatch_release(waitSema);
}

または、次のように、完了ブロックを介して呼び出しを連鎖させることができます。

- (void) method123
{
    callAsynchAPIPart1WithCompletionBlock(^(void) {
        // Do completion of method1 then call method2
        callAsynchAPIPart2WithCompletionBlock(^(void) {
            // Do completion of method2 then call method3
            callAsynchAPIPart1WithCompletionBlock(^(void) {
                // Do your completion
            });
        });
    });
}
于 2013-04-26T12:56:42.123 に答える
0

Async API はバックグラウンド スレッドで処理されるため、メイン スレッドでメソッドを呼び出すだけです。

于 2013-04-26T11:21:22.613 に答える