2012-07-08 35 views
0

民间,在查看初始时间执行数据密集型计算

我想在以下情况下获得您的意见。我应用上的大多数屏幕都是表视图,其中表视图的行数和内容是通过首先从本地核心数据表中读取数据并对其执行一些复杂的计算来确定的。我希望以用户从一个屏幕转换到另一个屏幕时应用程序不冻结的方式执行此操作。这是我如何做到的。在视图中出现函数,我开始动画活动指示器,然后产生一个线程从核心数据表中读取数据,并对其执行所有相关的计算。在这个线程内部,在完成计算后,我停止为活动指示器设置动画,标记初始化完成的标志,然后重新加载表格视图。在初始化完成之前加载表格视图单元格将返回空单元格。 (我注意到tableView数据源函数在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]; 

} 

我想知道是否有更好的方法做到上述。

在此先感谢您的回复!

+0

什么是 “myQueue中”。显示代码 – coneybeare 2012-07-08 14:20:26

+0

dispatch_queue_t myQueue; myQueue = dispatch_queue_create(“myFirstQueue”,NULL); – user1306828 2012-07-08 19:22:48

回答

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 
} 
+0

我想知道这将如何工作,因为coredata得到和计算将不会执行时,用户切换到不同的屏幕,并回到这一点。 (viewDidLoad只被调用一次)。谢谢! – user1306828 2012-07-08 19:24:41

+0

您的问题要求提供“初始时间”。你可以把它放在任何地方 – coneybeare 2012-07-08 19:34:39

+0

太棒了!感谢您的答复。 – user1306828 2012-07-08 23:28:33