我是IOS开发的新手,目前正面临一个问题。
调用方法A时,它调用方法B,然后等待委托connectionDidFinish
connectionDidFinish
将执行MethodC。
我的问题是如何在执行NSLog之前确保methodA到methodC已完成执行?
我发现解决此问题的方法是使用通知中心。完成执行methodC后向我发送通知。我不认为这是一个很好的解决方案。还有另一种方法吗?
示例:
[a methodA];
NSLog(@"FINISH");
答案 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开始使用完成块。例如: