1

我的应用程序正在获取相当大的 JSON 数据提要,代表数千种产品数据。在 CoreData 中解析和保存数据后(全部在后台线程中),UITableView在解析后显示数据会阻塞 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];
}
4

2 回答 2

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:

于 2013-06-19T23:03:21.423 回答
0

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

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

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

于 2013-06-20T04:20:30.250 回答