首先启动应用程序时,应用程序会从后端预填充其本地持久性存储。它发生在DISPATCH_QUEUE_PRIORITY_LOW
上,但是当用户在tableView中同时滚动时它就会流泪。我还可以做些什么?沉重的东西已经处于最低优先级。
答案 0 :(得分:0)
我有一个想法,但在这里我建议使用NSOperation(如果你有足够的时间重构一些代码)。您可以组织下载过程抛出NSOperationQueue。
例如,
- (NSOperationQueue *)downloadQueue {
if (!_downloadQueue) {
_downloadQueue = [[NSOperationQueue alloc] init];
_downloadQueue.name = @"Download Queue";
_downloadQueue.maxConcurrentOperationCount = 1;
}
return _downloadQueue;
}
子类NSOperation
添加覆盖主要功能,您可以在其中编写下载代码
- (void)main {
// 4
@autoreleasepool {
// download code here
}
下一步 - 检查用户何时开始滚动tableview(或任何您想要的用户交互)以及在该事件上执行的启动/停止操作)。例如,对于uitableview,它看起来像:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
// 1
[self.model suspendAllOperations];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
// 2
[self.model resumeAllOperations];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[self.model resumeAllOperations];
}
模型这里是一个NSObject子类,它处理所有下载过程(独立于UI),您可以在其中暂停/恢复操作。
- (void)suspendAllOperations {
[_downloadQueue setSuspended:YES];
}
- (void)resumeAllOperations {
[_downloadQueue setSuspended:NO];
}
- (void)cancelAllOperations {
[_downloadQueue cancelAllOperations];
}
因此,当您希望在UI中进行大量操作时,可以停止后台进程并在需要时恢复。您也可以更改maxConcurrentOperationCount以获得最佳性能(您可以在进行一些测试/测量后设置此参数)
希望这有帮助。
答案 1 :(得分:0)
你可以做一些我相信的事情
1)你可以从一个空数据集开始,当你完成所有数据时,在你的构建块中使用'''self.tableview.reloadData()'''。
2)如果那是不可能的,那么你总是可以提供一个加载器,以便在创建数据时禁用其余的UI,这个很容易使用https://github.com/jdg/MBProgressHUD
答案 2 :(得分:0)
DISPATCH_QUEUE_PRIORITY_BACKGROUND
的优先级更低。如果这没有帮助我认为你可以: