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请求),并提供一个完成块,一旦请求完成(或失败)