如何让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 的优先级更低。如果这没有帮助,我想你可以:

  1. 预填充串行队列。大多数 iOS 设备有 2 个以上的内核,其中 1 个应该能够处理 table 滚动。
  2. 预填充较慢。可能是您在预填充期间填充了内存带宽或刷新了 L2 缓存。这可能很难解决。也许您可以定期重新加载所有可见的 table 单元格以防止代码过时,但它也可能会干扰用户滚动。