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

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

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

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

我发现解决这个问题的一个办法是使用通知中心。 完成执行methodC后发送通知给我。 我不认为这是一个好的解决scheme。 有没有另外一种方法来做到这一点?

例:

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

如果这些方法中的任何一个asynchronous执行操作,则不能。 你将不得不寻找一个不同的方式来做到这一点。 我个人尝试尽可能使用完成块,尽pipe用其他方式完成这个任务,就像使用委托方法一样。 这是一个使用完成块的基本示例。

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

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

但是,如果methodA启动一个需要一段时间才能完成并返回的asynchronous进程,那么您需要做一些不同的事情。 通常你不想在等待的时候冻结用户界面,所以你build立了一个委托,通过一个完成块,或者等待一个“OK,I'm done”的通知。

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

较新的API正在开始使用完成块。 例子是:

  • presentViewController:animated:completion:,它接收一个完成块,一旦新的视图控制器完全在屏幕上并被“准备就绪”,就会被调用。
  • animateWithDuration:animations:completion:,它完成一个animation完成后执行的完成块
  • sendAsynchronousRequest:queue:completionHandler:,它启动一个asynchronousURL请求(通常是一个HTTP GET或PUT请求),并提供一个完成块,一旦请求完成(或失败)