作者HuangJC (吹笛牧童)
看板MacDev
标题[问题] UICollectionView 的更新可不可以加快
时间Fri Oct 31 20:39:09 2014
最近写的程式架构:
1.画面上有其他 ui 按键,比如左右键,以浏览於不同资料间
2.另外再摆一个 UICollectionView,用来展示资料
因此,每按一下左右键,collection view 就要更新一下资料
它内容有数十笔,夸张的说它要更新两秒好了
当 user 快速点击左右键时,这个设计就难以忍受
因为点击左右键的速度大约可以一秒三下
我们另外有摆一个 label,用来指示正在浏览什麽资料
如果不更新 collection,情况会很完美,label 会更新得很快
假设我要把 collection 的更新搬到另一个 thread 去做
这会面临'所有 ui 更新都应该在 main thread 做'的经典问题;否决
另一个想法是,左右键更新 label 要快
而 collection 更新慢没有关系;最後再追上而同步即可
但实作上还是有问题
因为当 collection 开始更新,它就是会锁住 ui 两秒
这两秒内如果按 ui, 是不会取得控制权的
(若能取得,我就有解法了;我可以马上更新内部文件
假设目前 cellForItemAtIndexPath 函式回应到第十个元件好了
从第11个起,我可以回它新文件的资料
画面是会半新半旧没错,但不会卡卡
我可以马上下个 reload,下一轮更新时再把文件整个刷新)
因此问题或许是在 collection 更新时,我有没有法子从 ui 取得控制权?
谢谢
--
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.251.197.63
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/MacDev/M.1414759152.A.8D1.html
※ 编辑: HuangJC (60.251.197.63), 10/31/2014 20:40:59
1F:推 tentenlee: 你先把再cellForItemAtIndexPath内的程式优化吧 10/31 20:49
2F:→ tentenlee: 应该是你作太多东西才会导致太慢,还有cellsize的部份 10/31 20:50
有考虑过这问题
所以把运算全部取消
只把每个 cell 填 'tt' 去模拟
光这样就好,速度就已经不可忍受了
而正式版 tt 必需代换成一段运算,一定更受不了
如果用 'tt' 模拟可以忍受的话
我会把运算分到另一个 thread 去做,并且储存起来
ui thead 来取用时,就只是提取资料而已
----
其实我在想,也许我手动打造数十个 label 会比用 collection 还好
因为 collection 的弹性太大
它可卷动等特性我是完全用不到的
我把它弄成数十个展示在一个画面上,而且画面 layout 只要做一次,永不更动
说穿了我只是想告诉自己:我还懂用一个现成大元件,而不是一堆小元件去打造
※ 编辑: HuangJC (60.251.197.63), 10/31/2014 21:21:44
3F:→ HuangJC: 若用一堆小元件去打造,则我自己做的 reload 指令必然要 10/31 21:23
4F:→ HuangJC: forloop 到所有小元件,这件事我可以要求它能被中断 10/31 21:23
5F:→ HuangJC: forloop 跑完前 ui 无法取得控制权,所以别用 forloop做 10/31 21:24
中间都要穿插一些可以 listen ui event 的机会
※ 编辑: HuangJC (60.251.197.63), 10/31/2014 21:29:17
6F:→ uranusjr: 你必须把你做的东西描述得更清楚, 甚至提供 minimal 10/31 21:51
7F:→ uranusjr: reproducing example, 不然你只是在浪费大家(包含你自 10/31 21:52
8F:→ uranusjr: 己)的时间在瞎猜而已。 10/31 21:52