Re: [问题] UICollectionView 的更新加快(已解决)

楼主: mraaa (重新出发....)   2014-11-04 03:53:31
※ 引述《HuangJC (吹笛牧童)》之铭言:
: : → mraaa: 何不用OperationQueue的方式把每一小块的运算放进Queue里? 11/02 13:36
: : → mraaa: 再配合Thread,每个Operation做完用Delegate回头去处理显示 11/02 13:37
: : → mraaa: 基本上CollectionView适合每个小块会重复的动作.... 11/02 13:38
: : → mraaa: 如果每个小区块都不同...实在没有用CollectionView的意义 11/02 13:39
: 刚大略看了 NSOperationQuere
: 不知道我这是不是多做了
: 这两天我写了个架构,可以重复使用,解决了运算及 ui 间不流畅的问题:
: 1.我设定的任务是 ui 可以有输入,然后内部要经过运算,再去更新 ui
: 2.假设计算很花费时间,比如两秒,因此我另外用一个专门的 thread 在做
: 3.当运算中如果 ui 又有输入,则会重新运算,不急着更新 ui
: 因此输出结果的 ui 是会有点慢,但整体就流畅了 (输入部份不会卡卡)
: 这就是我经常被要求的,程式架构如下
: - (void)updateThread
: {
: [mDirtyEvent lock];
: while ( !mQuitThread ) {
: if ( !mDirty )
: [mDirtyEvent wait];
: mDirty = false;
: //calc, 假设两秒, 因为这是专门运算的 thread, 所以不会拖到 ui
: if ( mDirty )
: continue;
: dispatch_async(dispatch_get_main_queue(), ^{
: //update ui, 因为 ui 必需在 mainthread 中操作,所以必需
: //dispatch 出去
: });
: }
: [mDirtyEvent unlock];
: }
: - (void)setDirty
: {
: mDirty = true;
: [mDirtyEvent signal];
: }
: - (void)init
: {
: newObj->mDirtyEvent = [NSCondition new];
: dispatch_queue_t queue =
: dispatch_queue_create("updateui", NULL);
: dispatch_async(queue, ^{
: [newObj updateThread]; //启动一个专门运算的 thread
: });
: }
: - (void)dealloc
: {
: mQuitThread = true;
: }
: 如上,这架构这两天用得蛮开心的
: 但还是有些不懂
: mQuitThread 这个变量,似乎不太需要
: 因为 updateThread 好像会自己结束,根本不用我操心
: 这是我难以理解的..
如果照你说的流程,我会选择在有新的输入的时候就把旧的Task给Cancel掉,然后重新起
新的Task!
建议你用Operation Queue是因为它本身应该就已经是Multithread了!我永远都相信,如
果原生就有提供工具来实作,我就会让它来处理这种东西!自己写的不见得比较好!就像
我说的Cancel Operation功能在OperationQueue就已经有提供了!
作者: HuangJC (吹笛牧童)   2014-11-04 14:29:00
主要是视野问题啦,我觉得我在写系统有提供的东西,但系统的东西我又用得不熟,逼不得已就模仿一个小的像我那个 while loop,我就想到 runloop,但我真的不会写runloop在你的说法,我们假设我有 50 个 cell,你可以切成50个运算,然后各别 update 50个 cell,很完美又不会卡,也不必在乎任何一个 cell 先或后完成;一切听天由命但我这串文所提出的第一个问题是:我无法把50个update拆开,一但 updateall,就是50个全做;假设全做要一秒,就卡住了。也就是说我要到发现可以各别update single cell 时才想到可以用你的做法..最新进度是,我似乎还是不能用 operationqueue,细节不同因为它的 cancel 并不能中断已经开始的 block,而我要求所有 block不要同时执行,要一个一个执行也就是同步异步的问题;这么龟毛只好自己打造了
作者: Blueshiva (龙野南云)   2014-11-04 20:39:00
所谓的queue,就是一个个拿出来执行啊...哪来的所有block同时执行...另外只要原po找一下HuangJC的文章,就会知道自干轮子是他的人生信仰(其实这也没啥不好...)
作者: HuangJC (吹笛牧童)   2014-11-04 20:59:00
找一下我文章还可以发现其他事咧哪来所有 block 同时执行这事,我已经写程式验过了公司交代的任务有时间限制,不管是否自己打造但我完成了而且来这板问之前我有先问过同事,没别人会,他们还等我
作者: Blueshiva (龙野南云)   2014-11-04 21:03:00
啊,抱歉,因为我记得opqueue是可以设定一个个执行的
作者: HuangJC (吹笛牧童)   2014-11-04 21:03:00
带答案回去分享..设定?那就是要设了,我找找
作者: HuangJC (吹笛牧童)   2014-11-04 21:15:00
谢谢,应该是;有空我再把自己写的程式改掉,谢谢(不过这东西和 Android 不知有没有对称,我们总是要一样的产品写一式两套,android & ios 都要写)

Links booklink

Contact Us: admin [ a t ] ucptt.com