在应用程序启动时正确设计数据库

时间:2016-08-28 23:03:07

标签: ios iphone multithreading

也许这是一个非常重复的问题,如果是这样,我很抱歉,但在阅读了所有相似的主题后,教程和尝试通过许多不同的方式,我总是无法有一个合适的设计。因此,我尝试务实并简化了以下内容:

我的应用程序提取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];
   });
} 

结果是: 大部分时间,它工作正常,但我有时会出现意想不到的行为,如:

  • “Collection< __ NSArrayM:0xb1a2970>在被列举时被突变“
  • NSRangeException
  • 或者我发现可能根本没有调用refreshAll,或者奇怪地调用了两次!

有人能帮我理解我做错了什么,或者我的设计完全错了吗?我对IOS dev非常新。感谢。

0 个答案:

没有答案