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

Posted

技术标签:

【中文标题】在视图初始化期间执行数据密集型计算【英文标题】:Performing data intensive calculations during view init time 【发布时间】:2012-07-08 14:16:28 【问题描述】:

伙计们,

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


我想知道是否有更好的方法来完成上述操作。

提前感谢您的回复!

【问题讨论】:

什么是“myQueue”。显示代码 dispatch_queue_t myQueue; myQueue = dispatch_queue_create("myFirstQueue", NULL); 【参考方案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

【讨论】:

我想知道这将如何工作,因为当用户切换到不同的屏幕并返回此屏幕时,核心数据会获取并且不会执行计算。 (viewDidLoad 只被调用一次)。谢谢! 您的问题要求“初始化时间”。你可以把它放在任何地方 太棒了!感谢您的回复。

以上是关于在视图初始化期间执行数据密集型计算的主要内容,如果未能解决你的问题,请参考以下文章

如何在执行C ++期间动态查看堆

是否有在 Apache Tomcat 6.x 启动期间执行代码以执行初始化例程等的方法?

如何在 WPF 应用程序启动期间显示等待光标?

Xcode 13 beta 5 错误:UIViewController 缺少初始化期间填充的初始特征集合

在 C++ 中的数组初始化期间使用数组成员 [重复]

C#编译和运行原理