如何让APP更负责任?
How to make app more responsible?
首次启动应用时,应用会从后端预填充其本地持久存储。它发生在 DISPATCH_QUEUE_PRIORITY_LOW
上,但当用户同时在 tableView 中滚动时它会撕裂。我还可以做些什么?重的东西已经处于最低优先级。
我有一个想法,但在这里我建议使用 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
}
下一步 - 检查用户何时开始滚动表视图(或您想要的任何用户交互)并开始/停止对该事件执行的操作)。例如,对于 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];
}
Model 这是一个 NSObject 子类,它处理所有下载过程(独立于 UI),您可以在其中进行 suspend/resume 操作。
- (void)suspendAllOperations {
[_downloadQueue setSuspended:YES];
}
- (void)resumeAllOperations {
[_downloadQueue setSuspended:NO];
}
- (void)cancelAllOperations {
[_downloadQueue cancelAllOperations];
}
因此,当您预计 UI 中有繁重的操作时,您可以停止后台进程并在需要时恢复它。您也可以更改 maxConcurrentOperationCount 以获得最佳性能(您可以在一些测试/测量后设置此参数)
希望对您有所帮助。
我相信你可以做一些事情
1) 您可以从一个空数据集开始,当您完成获取所有数据后,在构建块中使用 ''' self.tableview.reloadData() '''。
2) 如果那不可能,那么您总是可以提供一个加载程序,以便在创建数据时禁用 UI 的其余部分,这个非常容易使用 https://github.com/jdg/MBProgressHUD
DISPATCH_QUEUE_PRIORITY_BACKGROUND
的优先级更低。如果这没有帮助,我想你可以:
- 预填充串行队列。大多数 iOS 设备有 2 个以上的内核,其中 1 个应该能够处理 table 滚动。
- 预填充较慢。可能是您在预填充期间填充了内存带宽或刷新了 L2 缓存。这可能很难解决。也许您可以定期重新加载所有可见的 table 单元格以防止代码过时,但它也可能会干扰用户滚动。
首次启动应用时,应用会从后端预填充其本地持久存储。它发生在 DISPATCH_QUEUE_PRIORITY_LOW
上,但当用户同时在 tableView 中滚动时它会撕裂。我还可以做些什么?重的东西已经处于最低优先级。
我有一个想法,但在这里我建议使用 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
}
下一步 - 检查用户何时开始滚动表视图(或您想要的任何用户交互)并开始/停止对该事件执行的操作)。例如,对于 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];
}
Model 这是一个 NSObject 子类,它处理所有下载过程(独立于 UI),您可以在其中进行 suspend/resume 操作。
- (void)suspendAllOperations {
[_downloadQueue setSuspended:YES];
}
- (void)resumeAllOperations {
[_downloadQueue setSuspended:NO];
}
- (void)cancelAllOperations {
[_downloadQueue cancelAllOperations];
}
因此,当您预计 UI 中有繁重的操作时,您可以停止后台进程并在需要时恢复它。您也可以更改 maxConcurrentOperationCount 以获得最佳性能(您可以在一些测试/测量后设置此参数)
希望对您有所帮助。
我相信你可以做一些事情
1) 您可以从一个空数据集开始,当您完成获取所有数据后,在构建块中使用 ''' self.tableview.reloadData() '''。
2) 如果那不可能,那么您总是可以提供一个加载程序,以便在创建数据时禁用 UI 的其余部分,这个非常容易使用 https://github.com/jdg/MBProgressHUD
DISPATCH_QUEUE_PRIORITY_BACKGROUND
的优先级更低。如果这没有帮助,我想你可以:
- 预填充串行队列。大多数 iOS 设备有 2 个以上的内核,其中 1 个应该能够处理 table 滚动。
- 预填充较慢。可能是您在预填充期间填充了内存带宽或刷新了 L2 缓存。这可能很难解决。也许您可以定期重新加载所有可见的 table 单元格以防止代码过时,但它也可能会干扰用户滚动。