也许这是一个非常重复的问题,如果是这样,我很抱歉,但在阅读了所有相似的主题后,教程和尝试通过许多不同的方式,我总是无法有一个合适的设计。因此,我尝试务实并简化了以下内容:
我的应用程序提取3个SQL查询,这些查询非常快,但它们包含应用程序所需的所有信息。所以我会在刷新UI控件之前等待它们。 我通过在单例类中创建3个分隔NSURLSessionDataTask来执行db fetch。类似的东西:
-(void)fetchdb {
[self runDataTask:request1];
[self runDataTask:request2];
[self runDataTask:request3];
}
-(void)runDataTask: request {
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
[dataTask resume];
}
我在初始视图控制器的viewDidLoad中调用此fetch:
- (void)viewDidLoad {
[super viewDidLoad];
[mySingletonClass fetchDb:self];
// other stuffs
}
当调用所有三个任务的NSURLSessionDelegate中的didCompleteWithError并且我的三个列表都由任务1,2和3构建时,我调用初始视图控制器的refreshAll方法:
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error{
if (error == nil){
[self.delegate buildTargetList];
if (list1.count>0 && list2.count>0 && list3.count>0)
[initialViewController refreshAll];
}
}
最后,refreshAll通过main_queue中的dispatch_sync刷新所有UI(我必须使用sync,因为在同一个块中我首先填充我要刷新的UI使用的数组):
-(void)refreshAll {
dispatch_sync(dispatch_get_main_queue(),^{
[self buildAllLocalArraysForAllUIByUsingSingletonClassLists];
[self refreshAllUI];
});
}
结果是: 大部分时间,它工作正常,但我有时会出现意想不到的行为,如:
有人能帮我理解我做错了什么,或者我的设计完全错了吗?我对IOS dev非常新。感谢。