【问题标题】:ios: waiting for method to finish executing before continuingios:在继续之前等待方法完成执行
【发布时间】:2013-12-26 04:12:58
【问题描述】:

我是 IOS 开发新手,目前遇到问题。

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

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

我发现解决这个问题的一种方法是使用通知中心。执行完methodC后向我发送通知。我不认为这是一个好的解决方案。有没有其他方法可以做到这一点?

例子:

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

【问题讨论】:

标签: ios objective-c


【解决方案1】:

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

- (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 两次吗?我可以打电话给完成(ifThingWorked)谢谢
  • @ElizaS 第一个将代码执行移动到后台线程,您可以在其中执行阻塞操作。第二个返回主线程,以便您可以执行更新 UI 等操作。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    相关资源
    最近更新 更多