我有两个方法,如loadTopicPostsFromDB和loadTopicPosts。在loadTopicPostsFromDB方法中,我正在更新名为strLastTimeStamp的全局NSString的值,该值应该在loadTopicPosts中使用。因此,我想首先执行loadTopicPostsFromDB并在完成后(全局字符串更新)我想执行loadTopicPosts方法。 这就是我做到的。但是,目前loadTopicPosts方法在更新全局strLastTimeStamp之前执行,所以我总是得到一个错误的strLastTimeStamp。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
[self performSelectorOnMainThread:@selector(loadTopicPostsFromDB) withObject:nil waitUntilDone:NO];
});
dispatch_group_notify(group, queue, ^{
NSLog(@"LoadDBCompleted");
[self loadTopicPosts];
});
我怎么能这样做,请告诉我这个实施中的错误。
答案 0 :(得分:0)
performSelectorOnMainThread:iOS将任务放入队列后立即完成。当调用返回时,选择器很可能甚至没有开始运行。实际上,你根本不应该使用performSelectorOnMainThread - 这个功能在Swift中是不可用的,这是有充分理由的。解决方案更容易(自己解决问题):
dispatch_async (dispatch_get_main_queue (), ^{
[self loadTopicsFromDB];
[self loadTopicPosts];
});
您可能希望在后台线程上执行loadTopicsFromDB。
答案 1 :(得分:0)
当您使用网络连接做某事时,我建议您使用blocks
来处理呼叫的端点。
在此代码中编写
非常简单dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self loadTopicsFromDB: ^(BOOL success, NSError *error) {
[self loadTopicPosts];
}];
});