2013-06-19 33 views
1

我的应用正在获取JSON数据的提要,代表数以千计的产品数据。在CoreData中解析并保存数据后(全部在后台线程中),在解析完UI之后在UITableView中显示数据,因为它在主线程中完成。但问题在于用户界面仍然被阻塞了几秒钟,这不是用户友好的。那么你如何建议我可以在不阻止UI的情况下处理重新加载数据?在不阻挡用户界面的情况下在UITableView中重新加载数据

//... 
//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]; 
} 
+0

是否需要花费几秒钟的时间来调用'reloadData'本身? – Isaac

+0

实际上,在将数据显示到'UITableView'后,UI被阻塞了几秒钟 – Malloc

+4

另外,您的视图控制器是使用NSFetchedResultsController还是手动获取对象并将它们存储在数组中?第二个问题,你说你的数据处理是在后台线程中处理的。这是否意味着您的所有更改都是在子环境中完成的?并且您的持久性存储协调器也链接到主线程或后台线程中的上下文。如果它在主线程中,实际保存到磁盘可能会阻止你的UI – mrosales

回答

4

基于sangony评论,事实证明,tableView:heightForRowAtIndexPath:委托方法的调用影响尤其是与我的情况,我处理了3000个多行的表现。这里是与苹果文档:

self.tView.rowHeight = 200.0; 

,当然还有:

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). 

其他线程的讨论类似的问题,我可以在表视图属性分配行高度摆脱性能问题,删除tableView:heightForRowAtIndexPath:的执行,否则它将覆盖rowHeight属性。请注意,这只有在我处理单行高度的情况下才解决我的问题。因此,如果需要应用多个行高值,则需要使用tableView:heightForRowAtIndexPath:

0

使用NSThread来调用一个方法,您可以在其中获取Json数据,并在获取后使用相同的方法重新载入表。

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

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

相关问题