在我的应用程序中,我有两个方法,storeData和gotoNextView。我希望在storeData方法完成执行后执行gotoNextPage。在storeData中我保存使用Egocache成功登录后获得的令牌,在gotoNextPage中我有用于加载新视图控制器的代码,在下一个viewcontroller中我必须使用令牌来获取其他详细信息。但是问题方法gotoNextView正在storeData之前执行,所以我在下一个视图中获得了gettin null标记。
我尝试过使用以下内容:
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
[self storeData];
});
dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
[self gotoNextPage];
上面的代码正在服务于此目的,但是当我使用上面的代码时,下一个视图中的NSUrlConnections没有加载。
[self storeData];
[self performSelector:@selector(gotoNextPage) withObject:nil afterDelay:1.0f];
此代码正常工作,下一个视图中的NSUrlConnections也正常工作,但是有更好的方法来实现此目的
答案 0 :(得分:4)
您可以将完成块传递给storeData方法。这样storeData可以让你知道什么时候它完成了它需要做的事情,而不是你想要猜测。
- (void)storeDataWithCompletion:(void (^)(void))completion
{
// Store Data Processing...
if (completion) {
completion();
}
}
// Calling storeDataWithCompletion...
[self storeDataWithCompletion:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self gotoNextPage];
});
}];
不需要dispatch_async到主队列。我补充说,因为gotoNextPage与UI相关,并且不清楚什么线程storeDataWithCompletion:将调用完成块。
Here's a link to Apple's documentation on blocks
希望这有帮助。