作者mraaa (重新出发....)
看板MacDev
标题Re: [问题] UICollectionView 的更新加快(已解决)
时间Tue Nov 4 03:53:31 2014
※ 引述《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就已经有提供了!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 70.192.17.168
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/MacDev/M.1415044413.A.1E0.html
1F:推 HuangJC: 主要是视野问题啦,我觉得我在写系统有提供的东西,但系 11/04 14:29
2F:→ HuangJC: 统的东西我又用得不熟,逼不得已就模仿一个小的 11/04 14:30
3F:→ HuangJC: 像我那个 while loop,我就想到 runloop,但我真的不会写 11/04 14:30
4F:→ HuangJC: runloop 11/04 14:30
5F:→ HuangJC: 在你的说法,我们假设我有 50 个 cell,你可以切成50个 11/04 14:31
6F:→ HuangJC: 运算,然後各别 update 50个 cell,很完美又不会卡,也不 11/04 14:31
7F:→ HuangJC: 必在乎任何一个 cell 先或後完成;一切听天由命 11/04 14:32
8F:→ HuangJC: 但我这串文所提出的第一个问题是:我无法把50个update拆 11/04 14:32
9F:→ HuangJC: 开,一但 updateall,就是50个全做;假设全做要一秒,就卡 11/04 14:33
10F:→ HuangJC: 住了。也就是说我要到发现可以各别update single cell 时 11/04 14:33
11F:→ HuangJC: 才想到可以用你的做法.. 11/04 14:33
12F:推 HuangJC: 最新进度是,我似乎还是不能用 operationqueue,细节不同 11/04 17:16
13F:→ HuangJC: 因为它的 cancel 并不能中断已经开始的 block,而我要求所 11/04 17:16
14F:→ HuangJC: 有 block不要同时执行,要一个一个执行 11/04 17:17
15F:推 HuangJC: 也就是同步非同步的问题;这麽龟毛只好自己打造了 11/04 17:22
16F:→ Blueshiva: 所谓的queue,就是一个个拿出来执行啊...哪来的所有 11/04 20:39
17F:→ Blueshiva: block同时执行... 11/04 20:39
18F:→ Blueshiva: 另外只要原po找一下HuangJC的文章,就会知道自干轮子是 11/04 20:39
19F:→ Blueshiva: 他的人生信仰(其实这也没啥不好...) 11/04 20:40
20F:→ HuangJC: 找一下我文章还可以发现其他事咧 11/04 20:59
21F:→ HuangJC: 哪来所有 block 同时执行这事,我已经写程式验过了 11/04 20:59
22F:推 HuangJC: 公司交代的任务有时间限制,不管是否自己打造但我完成了 11/04 21:02
23F:→ HuangJC: 而且来这板问之前我有先问过同事,没别人会,他们还等我 11/04 21:02
24F:推 Blueshiva: 啊,抱歉,因为我记得opqueue是可以设定一个个执行的 11/04 21:03
25F:→ HuangJC: 带答案回去分享.. 11/04 21:03
26F:→ HuangJC: 设定?那就是要设了,我找找 11/04 21:03
27F:→ Blueshiva: 你可能开到的是只要系统ok就尽量多跑几个的那种 11/04 21:03
28F:→ Blueshiva: key: operationqueue setmaxconcurrentoperationcount 11/04 21:05
29F:→ Blueshiva: @HuangJC:看看这是不是你要的 11/04 21:05
30F:推 HuangJC: 谢谢,应该是;有空我再把自己写的程式改掉,谢谢 11/04 21:15
31F:→ HuangJC: (不过这东西和 Android 不知有没有对称,我们总是要一样 11/04 21:16
32F:→ HuangJC: 的产品写一式两套,android & ios 都要写) 11/04 21:16