【问题标题】:Slow UITableView with UIScrollView and PageControl inside each custom cell每个自定义单元格内带有 UIScrollView 和 PageControl 的慢速 UITableView
【发布时间】:2015-12-02 07:44:21
【问题描述】:

我正在使用 Swift 2.0 开发 iOS 应用程序,但无法快速加载 UITableView,现在加载大约需要 1-2 秒。

我有什么。

我有一个带有自定义单元格的 UITableView。每个自定义单元格都有用于水平滚动的 UIScrollView 和 PageControl。

在 UIScrollView 的每个页面上还需要添加一个单独的 xib。此 xib 包含带有两个 UIViewPicker 的视图。

工作原理

在“tablewView: cellForRowAtIndexPath”中,我正在调用一个函数,该函数使用 xib 文件实例化子视图并用数据填充它。然后将其添加到 scrollView 并配置分页。

什么是慢

如果我将 10-20 页添加到 3 个单元格,它已经非常慢(1-3 秒)。

我已经尝试移动逻辑,将数据填充到后台线程中的子视图中,然后稍后在主线程中将这些子视图添加到单元格中。它使整个 tableView 快速显示,但您需要等待多长时间才能看到每个单元格内的实际数据仍然很愚蠢。

我查看了 Instruments,在我看来,我所有的数据计算都非常快,但是使用 uipickers 添加这些子视图是最慢的部分。

我还尝试仅添加第一个 subView,然后在用户开始在单元格上水平滚动时添加所有其余部分。速度快了 10 倍,但延迟仍然很明显,而且逻辑要复杂得多(在滚动拖动时添加新的子视图并不是很简单)。

关于我应该在哪里寻找以及如何使整个概念快速发挥作用有什么更好的建议吗?我相信它可以很快,只需要改进逻辑。

【问题讨论】:

标签: ios objective-c xcode uitableview uiscrollview


【解决方案1】:

我认为“如果用户开始在单元格上水平滚动,则仅添加第一个 subView,然后添加所有其余部分。”很好。我建议这样做:加载第一个 subView。然后加载其他睡眠时间。比如:

// load others, 
notMainthread{
  for (...subviews){
    mainThread{
      loadSubView();
    }
    sleep(0.01);
  }
}

我不知道swift,所以我写了一个伪代码。 链接应用我为加载太多子视图所做的事情:https://itunes.apple.com/vn/app/liveradio/id998787831

一些代码:

    // running on not main thread    
    for (int i=0; i<[listCT count]; i++) {
        ...
        dispatch_async( dispatch_get_main_queue(), ^{
            emptyImage.frame = CGRectMake(0, yEndLast, cWidthTop, yStart-yEndLast);
            [emptyImage setContentMode:UIViewContentModeCenter];
            [contentView addSubview:emptyImage];
        });
        [NSThread sleepForTimeInterval:0.004];
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多