应用程序需要很长时间才能更新UIView

时间:2013-03-26 13:15:06

标签: objective-c user-interface asynchronous

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

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

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

我尝试使用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个事件 我可以独立添加子视图而不是同时添加子视图,而不是等到它完成所有事件之后才会进行添加吗?

1 个答案:

答案 0 :(得分: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.
    }
});

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

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

_updateQueue = dispatch_queue_create( "UpdateQueue", DISPATCH_QUEUE_SERIAL);

并使用它代替:

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)

的上方。