iOS: 等待方法执行完毕后再继续

3

我是IOS开发的新手,目前遇到了一个问题。

当调用方法A时,它会调用方法B,然后等待委托connectionDidFinish完成后执行MethodC。

我的问题是,如何确保methodA到methodC已经执行完毕才执行NSLog?

我发现解决这个问题的一种方法是使用通知中心。在执行完MethodC后向我发送通知。但我认为这不是一个好的解决方案。有其他方法吗?

示例:

 [a methodA];
 NSLog(@"FINISH");

请阅读观察者模式http://en.wikipedia.org/wiki/Observer_pattern。 - Krypton
2个回答

9
如果其中任何一种方法执行异步操作,那么你就不能这样做。你需要寻找另一种方法来完成这个任务。我个人尽可能使用完成块(completion blocks),虽然用代理方法(delegate methods)等其他方式也是完全可以的。下面是一个使用完成块的基本示例。
- (void)someMethod
{
    [self methodAWithCompletion:^(BOOL success) {
        // check if thing worked.
    }];
}

- (void)methodAWithCompletion:(void (^) (BOOL success))completion
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{

        // go do something asynchronous...

        dispatch_async(dispatch_get_main_queue(), ^{

            completion(ifThingWorked)

        });
    });
}

你好,你能解释一下为什么我们需要使用两次dispatch_async吗? 我能不能只调用completion(ifThingWorked)?谢谢。 - ElizaS
@ElizaS 第一个将代码执行移至后台线程,以便您可以执行阻塞操作。第二个返回主线程,因此您可以执行诸如更新用户界面之类的操作。 - Mick MacCallum

2
在您发布的代码中,methodA 必须在日志语句执行之前完成执行。
然而,如果 methodA 启动了一个异步进程并且在完成之前返回需要一段时间,则需要进行不同的操作。通常情况下,您不希望在等待时冻结用户界面,因此您可以设置委托,传递完成块或等待“好的,我完成了”通知。
所有这些都是解决等待异步任务完成运行问题的非常有效和良好的方法。
新的API开始使用完成块。例如:
- presentViewController:animated:completion:,它接受一个完成块,该块在新视图控制器完全显示在屏幕上并“准备就绪”后调用。 - animateWithDuration:animations:completion:,它接受一个完成块,该块在动画完成后执行。 - sendAsynchronousRequest:queue:completionHandler:,它启动一个异步URL请求(通常是HTTP GET或PUT请求),并提供一个完成块,该块在请求完成(或失败)后被调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接