Ios 在UITableView中重新加载数据而不阻塞UI

Ios 在UITableView中重新加载数据而不阻塞UI,ios,multithreading,uitableview,Ios,Multithreading,Uitableview,我的应用程序获得了一个相当大的JSON数据源,代表数千种产品数据。解析并保存CoreData中的数据后,所有后台线程中的数据,解析后在UITableView中显示数据会阻止UI,因为它是在主线程中完成的。但问题是UI会被阻塞几秒钟,这对用户不友好。那么,您建议我如何在不阻塞UI的情况下处理重新加载数据 //... //After parsing data, reload UITableView [self.tView reloadData]; 编辑: 我可能会重新解释我的问题,解析数据后,重新

我的应用程序获得了一个相当大的JSON数据源,代表数千种产品数据。解析并保存CoreData中的数据后,所有后台线程中的数据,解析后在UITableView中显示数据会阻止UI,因为它是在主线程中完成的。但问题是UI会被阻塞几秒钟,这对用户不友好。那么,您建议我如何在不阻塞UI的情况下处理重新加载数据

//...
//After parsing data, reload UITableView
[self.tView reloadData];
编辑:

我可能会重新解释我的问题,解析数据后,重新加载数据,UITableView对象显示所有数据。然后UI会被阻塞几秒钟,然后我才能再次使用该应用程序

这是我的相关代码:

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON){
    //Parse data
    [self.tView reloadData];//Display data
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    //Save data
    }];

    }failure:^(NSURLRequest *request, NSHTTPURLResponse *response,NSError *error, id JSON){
    //
    }];
    [operation start];
}
根据sangony的评论,事实证明调用tableView:heightForRowAtIndexPath:delegate方法会影响性能,特别是在我处理3000多行的情况下。以下是与此相关的苹果文档:

    There are performance implications to using tableView:heightForRowAtIndexPath: instead of
 the rowHeight property. Every time a table view is displayed, it calls 
tableView:heightForRowAtIndexPath: on the delegate for each of its rows, which can result in a
 significant performance problem with table views having a large number of rows (approximately 
1000 or more).
从讨论类似问题的其他线程中,我可以通过在table view属性上指定行高度来消除性能问题:

self.tView.rowHeight = 200.0;
当然,还要删除tableView:heightforrowatinexpath:的实现,否则它将覆盖rowHeight属性。请注意,只有在处理单行高度时,这才能解决问题。因此,如果我需要应用多个行高值,而tableView:HeightForRowatineXpath:是必需的,那么这就帮不了忙了。

根据sangony注释,事实证明调用tableView:HeightForRowatineXpath:delegate方法会影响性能,特别是在我处理3000多行的情况下。以下是与此相关的苹果文档:

    There are performance implications to using tableView:heightForRowAtIndexPath: instead of
 the rowHeight property. Every time a table view is displayed, it calls 
tableView:heightForRowAtIndexPath: on the delegate for each of its rows, which can result in a
 significant performance problem with table views having a large number of rows (approximately 
1000 or more).
从讨论类似问题的其他线程中,我可以通过在table view属性上指定行高度来消除性能问题:

self.tView.rowHeight = 200.0;
当然,还要删除tableView:heightforrowatinexpath:的实现,否则它将覆盖rowHeight属性。请注意,只有在处理单行高度时,这才能解决问题。因此,如果我需要应用多个行高值,而tableView:heightForRowAtIndexPath:是必需的,那么这就帮不上忙了。

使用NSThread调用一个方法,在该方法中获取Json数据,并在获取后以相同的方法重新加载表

[NSThread detachNewThreadSelector:@selector(GetJsonDataAndReload) toTarget:self withObject:nil];
因此,此过程不会阻止用户交互。

使用NSThread调用一个方法,在该方法中获取Json数据,并在获取后用相同的方法重新加载表

[NSThread detachNewThreadSelector:@selector(GetJsonDataAndReload) toTarget:self withObject:nil];

因此,此过程不会阻止用户交互。

是调用重新加载数据本身占用了几秒钟吗?是的,实际上,在将数据显示到UITableView中后,UI会被阻止几秒钟。同样,您的视图控制器是否使用NSFetchedResultsController,还是手动获取对象并将其存储在数组中?第二个问题,您说过您的数据处理是在后台线程中处理的。这是否意味着您的所有更改都是在子上下文中完成的?并且您的持久性存储协调器是否链接到主线程或后台线程中的上下文。如果是在主线程中,实际保存到磁盘可能会阻塞您的uiHi,我编辑了我的帖子,请看一看。实际上,我使用MagicalRecord来保存数据。您是否使用tableView:heightForRowAtIndexPath:?是调用重新加载数据本身占用了几秒钟吗?是的,实际上,在将数据显示到UITableView后,UI被阻塞了几秒钟,您的视图控制器是使用NSFetchedResultsController还是手动获取对象并将其存储在阵列中?第二个问题,您说过您的数据处理是在后台线程中处理的。这是否意味着您的所有更改都是在子上下文中完成的?并且您的持久性存储协调器是否链接到主线程或后台线程中的上下文。如果是在主线程中,实际保存到磁盘可能会阻塞您的uiHi,我编辑了我的帖子,请看一看。实际上,我使用MagicalRecord来保存数据。是否使用tableView:heightForRowAtIndexPath:?