0

简而言之,我有一个应用程序,旨在显示存储在手机本地的一堆数据,在 CoreData 中。

我从 CoreData 中提取数据,然后将大约 70 个子视图添加到主 UIView。这会导致应用程序冻结(不响应),直到将所有子视图添加到主视图。

我想找到一种方法来异步添加所有子视图,以便应用程序不会冻结。

我尝试使用performSelectorOnMainThread,但它需要相同的时间。

我能做些什么?

谢谢。

[编辑] 每次按下按钮时,视图都必须更新自身,因此每次按下按钮时,它都会在数据库中搜索并更新视图,这意味着删除之前添加的所有子视图,并在主视图中添加大约 70 个子视图。

这有点像代码的样子:

currentEventsArray = I GET THE EVENTS FROM COREDATA
for(int i = 0; i < [currentEventsArray count]; i++){
    //I DO SEVERAL OPERATIONS WITH THE DATA AND THEN FINALLY...
    [self.view addsubview:aEventView];
 }

currentEventsArray 可以有 50 到 80 个事件,而不是等到它完成所有事件,我可以独立添加子视图而不是同时添加吗?

4

1 回答 1

2

我建议使用后台线程来读取数据并创建视图,然后将视图添加到主线程的主视图中。像这样的东西:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),  ^{
    currentEventsArray = /*I GET THE EVENTS FROM COREDATA*/;
    NSMutableArray *newViews = [[NSMutableArray alloc] init];
    for(int i = 0; i < [currentEventsArray count]; i++){
        //I DO SEVERAL OPERATIONS WITH THE DATA AND THEN FINALLY...
        [newViews addObject: aEventView];
    }
    dispatch_async( dispatch_get_main_queue(), ^{
        // add or replace your subviews to the main view.
    }
});

当您需要刷新数据时,请执行此操作。请记住,您可能不希望这种情况一次发生多个。您可以通过在控制器中放置一个标志来确保在控制器已经运行时不执行初始 dispatch_async 来做到这一点,或者您可以使用私有调度队列而不是全局后台队列来排队另一次尝试。

如果您选择使用自己的后台队列,那么您需要在调用类(控制器)中创建一个实例变量,并且当您加载它时,您需要创建一个新队列:

_updateQueue = dispatch_queue_create( "UpdateQueue", DISPATCH_QUEUE_SERIAL);

并使用它代替:

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)

以上。

于 2013-03-26T15:20:11.517 回答