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

时间:2013-06-19 21:38:47

标签: ios multithreading uitableview

我的应用程序正在获取代表数千种产品数据的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];
}

2 个答案:

答案 0 :(得分:4)

基于sangony注释,事实证明tableView:heightForRowAtIndexPath:委托方法的调用会影响性能,特别是在我处理超过3000行的情况下。这是与之相关的Apple文档:

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

从讨论类似问题的其他线程中,我可以通过在表视图属性上指定行高来摆脱性能问题:

self.tView.rowHeight = 200.0;

当然,删除tableView:heightForRowAtIndexPath:的实现,否则它将覆盖rowHeight属性。请注意,这仅在我处理单行高度时解决了我的问题。因此,如果我需要应用多个行高度值,则需要tableView:heightForRowAtIndexPath:,这无效。

答案 1 :(得分:0)

使用NSThread来调用获取Json数据的方法,并在获取之后,以相同的方法重新加载表。

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

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