ios:在继续之前等待方法完成执行

时间:2013-12-26 04:12:58

标签: ios objective-c

我是IOS开发的新手,目前正面临一个问题。

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

我的问题是如何在执行NSLog之前确保methodA到methodC已完成执行?

我发现解决此问题的方法是使用通知中心。完成执行methodC后向我发送通知。我不认为这是一个很好的解决方案。还有另一种方法吗?

示例:

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

2 个答案:

答案 0 :(得分:9)

如果这些方法中的任何一个异步执行操作,则不能。你将不得不研究一种不同的方式。我个人尝试尽可能使用完成块,尽管用其他方式完成这一点非常好,比如使用委托方法。这是使用完成块的基本示例。

- (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)

        });
    });
}

答案 1 :(得分:2)

在您发布的代码中,methodA 必须在执行日志语句之前完成执行。

但是,如果methodA启动一个需要一段时间才能完成并在完成之前返回的异步进程,那么您需要做一些不同的事情。通常,您不希望在等待时冻结用户界面,因此您需要设置委托,传入完成块或等待“确定,我已完成”通知。

所有这些都是解决等待异步任务完成运行问题的好方法。

较新的API开始使用完成块。例如:

  • presentViewController:animated:completion:,需要完成 一旦新的视图控制器完全被调用的块 在屏幕上和“为商业做好准备。”
  • animateWithDuration:动画:完成:,需要完成 动画结束后执行的块
  • sendAsynchronousRequest:queue:completionHandler:,它启动一个 异步URL请求(通常是HTTP GET或PUT请求)和 提供一个完成块,一旦请求被调用就会被调用 已完成(或失败)