1

我们有一些操作集,但是每个操作都会调用异步 API。我们希望等到 Async API 返回,然后开始执行第二个操作。

例如:我们有 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

您可以使用 a 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 回答