如何让应用更负责任?

时间:2015-06-24 13:46:50

标签: ios grand-central-dispatch

首先启动应用程序时,应用程序会从后端预填充其本地持久性存储。它发生在DISPATCH_QUEUE_PRIORITY_LOW上,但是当用户在tableView中同时滚动时它就会流泪。我还可以做些什么?沉重的东西已经处于最低优先级。

3 个答案:

答案 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的优先级更低。如果这没有帮助我认为你可以:

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