每个自定义单元格内带有 UIScrollView 和 PageControl 的慢速 UITableView
Slow UITableView with UIScrollView and PageControl inside each custom cell
我正在 Swift 2.0 中开发 iOS 应用程序,但在快速加载 UITableView 时遇到了问题,现在加载大约需要 1-2 秒。
我有什么
我有一个带有自定义单元格的 UITableView。每个自定义单元格都有用于水平滚动的 UIScrollView 和 PageControl。
在UIScrollView的每一页上还需要添加一个单独的xib。此 xib 包含带有两个 UIViewPickers 的视图。
工作原理
在 "tablewView: cellForRowAtIndexPath" 中,我正在调用一个函数,该函数使用 xib 文件实例化子视图并用数据填充它。然后将其添加到 scrollView 并配置分页。
怎么这么慢
如果我将 10-20 页添加到 3 个单元格,它已经慢得要死(1-3 秒)。
我尝试移动逻辑,将数据填充到后台线程中的子视图中,然后在主线程中将这些子视图添加到单元格中。它使整个 tableView 显示得很快,但你需要等待多长时间才能看到每个单元格中的实际数据仍然很愚蠢。
我查看了 Instruments,在我看来我所有的数据计算都非常快,但是使用 uipickers 添加那些子视图是最慢的部分。
我还尝试只添加第一个子视图,然后在用户开始在单元格上水平滚动时添加所有其余部分。它快了 10 倍,但延迟仍然很明显,逻辑也更复杂(在滚动拖动时添加新的子视图不是很简单)。
关于我应该在哪里查看以及如何使整个概念快速运行的任何更好的建议?我相信它可以很快只需要改进逻辑。
我觉得"add only first subView and then add all the rest if user starts to scroll horizontally on cells."不错。我建议这样:加载第一个子视图。然后加载其他睡眠时间。类似于:
// load others,
notMainthread{
for (...subviews){
mainThread{
loadSubView();
}
sleep(0.01);
}
}
我不知道swift,所以我写了一个伪代码。
Link app 我为加载太多子视图做了什么: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];
}
我正在 Swift 2.0 中开发 iOS 应用程序,但在快速加载 UITableView 时遇到了问题,现在加载大约需要 1-2 秒。
我有什么
我有一个带有自定义单元格的 UITableView。每个自定义单元格都有用于水平滚动的 UIScrollView 和 PageControl。
在UIScrollView的每一页上还需要添加一个单独的xib。此 xib 包含带有两个 UIViewPickers 的视图。
工作原理
在 "tablewView: cellForRowAtIndexPath" 中,我正在调用一个函数,该函数使用 xib 文件实例化子视图并用数据填充它。然后将其添加到 scrollView 并配置分页。
怎么这么慢
如果我将 10-20 页添加到 3 个单元格,它已经慢得要死(1-3 秒)。
我尝试移动逻辑,将数据填充到后台线程中的子视图中,然后在主线程中将这些子视图添加到单元格中。它使整个 tableView 显示得很快,但你需要等待多长时间才能看到每个单元格中的实际数据仍然很愚蠢。
我查看了 Instruments,在我看来我所有的数据计算都非常快,但是使用 uipickers 添加那些子视图是最慢的部分。
我还尝试只添加第一个子视图,然后在用户开始在单元格上水平滚动时添加所有其余部分。它快了 10 倍,但延迟仍然很明显,逻辑也更复杂(在滚动拖动时添加新的子视图不是很简单)。
关于我应该在哪里查看以及如何使整个概念快速运行的任何更好的建议?我相信它可以很快只需要改进逻辑。
我觉得"add only first subView and then add all the rest if user starts to scroll horizontally on cells."不错。我建议这样:加载第一个子视图。然后加载其他睡眠时间。类似于:
// load others,
notMainthread{
for (...subviews){
mainThread{
loadSubView();
}
sleep(0.01);
}
}
我不知道swift,所以我写了一个伪代码。 Link app 我为加载太多子视图做了什么: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];
}