在视图初始化时执行数据密集型计算

时间:2012-07-08 14:16:28

标签: ios

民间,

我想就以下情况征求您的意见。我的应用程序上的大多数屏幕都是表视图,其中表视图的行数和内容的数量是通过首先从本地核心数据表读取数据然后对其执行一些复杂计算来确定的。我想这样做的方式是当用户从一个屏幕转换到另一个屏幕时应用程序不会冻结。我是这样做的。在视图中确实出现了函数我开始设置活动指示器的动画,然后生成一个线程来读取核心数据表中的数据并对其执行所有相关计算。在这个线程中,完成计算后,我停止动画活动指示器,标记初始化完成的标志,然后重新加载表视图。在初始化完成之前加载表视图单元格将返回空单元格。 (我注意到在viewWillAppear之后和ViewdidAppear()之前立即调用表视图数据源函数)。贴在下面是我的代码:

-(void)viewWillAppear:(BOOL)animated {

   [super viewWillAppear:animated];
   NSLog(@"%s",__FUNCTION__);

}

-(void)viewDidAppear:(BOOL)animated {

   [super viewDidAppear:animated];
   NSLog(@"%s",__FUNCTION__);

   [activityOutlet startAnimating];

   dispatch_async(myQueue, ^{ [self getFromCoreData];

   });


}   

- (void) getFromCoreData {

   // Get from coredata and start calculations here


   [activityOutlet stopAnimating];
   activityOutlet.hidden = YES;

   [tableOutlet reloadData];

}

我想知道是否有更好的方法来做到这一点。

提前感谢您的回复!

1 个答案:

答案 0 :(得分:1)

UI更新必须在主线程上完成:

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self getFromCoreData];

        dispatch_async(dispatch_get_main_queue(), ^{
            activityOutlet stopAnimating];
            activityOutlet.hidden = YES;
            [tableOutlet reloadData];
        });
    });
}

- (void) getFromCoreData {
   // Get from coredata and start calculations here
}