Re: [問題] UICollectionView 的更新加快(已解決)

看板MacDev作者 (吹笛牧童)時間9年前 (2014/11/01 13:24), 9年前編輯推噓0(0013)
留言13則, 2人參與, 最新討論串1/1
結果發生了神奇的事 原本我說即使把 cell 內容填值這部份運算加快 即 cell.text = @"tt"; // 填固定值,所以運算極快了 也還是有嚴重的 lag 在我把程式分離出來後,竟然解決了 然後回頭再去調整原程式,本來無法加快的也加快了 Orz 我實在不知道當初怎麼調整的,會無論如何都調不出來 當初沒保留版本,現在死無對證 所以現在問題就變成要把運算及顯示拆開 在這邊還是想請問大家一個架構,在微軟的 Visual C++/MFC 下我寫得出來 但在 Object C 我寫不出來 --------- 假設我的運算時間長達兩秒,無法忍受 我可以用另一個 thread 來做,等做出來後再請 UI thread 顯示 而為了使 UI 的操作流暢,架構大概會是這樣 - (void)UIClick { PostToThread(^{ //在另一個 thread 中運算,並儲存結果,時間長達兩秒 PostToUI(^{ //要求 UI 顯示,時間也要半秒 }); }); } 如上,UI 若顯示快就沒問題了,但偏偏 UI 也還是要花上半秒 上面的架構執行結果大概會是 UI 接受動作後,畫面在兩秒後更新 每一次 click 都會更新一次 UI 而我想要更流暢的,就是如果在兩秒運算中又有 UI Click 進來 那麼運算完(也可以中斷;這先不列入目標)後又會馬上重啟運算 直到 user 完全沒再有 UI 輸入,才真的去更新 UI 這有點像多次 SetNeedsDisplay 後,被合併起來只執行一次更新的感覺 因此我想要的是 user click -> calc value user click -> calc value user click -> calc value //太久沒 click update UI 但我實作的結果是 user click -> calc value -> update UI user click -> calc value user click -> calc value -> update UI 有加快,不流暢 我 click 的速度大約 0.3秒一次,而 update ui 一但開始就佔用 0.5秒 這使得整個動作忽快忽慢,完全稱不上流暢 若 calc 佔用兩秒,照理每 0.3 秒一次的 click 是夠早告知系統應該連續運算 不要進入 update UI 才對 用另一個 calc thread 不就是為了流暢嘛 我的問題在,我捨不得開一個 thread 一直檢查 status 假設我自己做 dirty 管理 (就像 setNeedsDisplay) - (void)UIClick { mDirty = true; } 另一個 thread 只要監視 dirty 變數,一但 dirty 發生就去運算 - (void)calcThread { while(!QuitThread) { while ( mDirty == false ) //P1 ; mDirty = false; //calc 兩秒 if ( mDirty = false ) { //updateUI } } } 如上,這個 thread 一直在 while loop 中等待 一但 mDirty 變成 true,就會計算,在計算的一開始我就先 reset dirty 所以如果計算過程中又發生 UI click, 那麼就又會被 set dirty 於是 update ui 就不會被執行 總之一定要整個運算都完成並且沒有新的 ui click, 才會去更新 ui 這邏輯可用,但問題是另一個 thread 在 P1 這點 實在不該用 while loop 一直檢查 mDirty 這個變數 這代表這個 thread 一直瓜分 cpu 時間 在微軟的 Visual C, 我會用 event, 配合同步指令 但在 Object C 中,我想用 @syncronize 卻寫不出來... -- 活動/美食計劃 蘭嶼 魚白 勝興車站 星月天空 武陵 草嶺古道 嘉義阿里山小火車 保齡球  司馬庫斯 手包水餃 日月潭纜車 合歡攻頂 馬祖 鹽山 南庄 澎湖 溪頭/松林町 南投天梯 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 175.180.127.76 ※ 文章網址: http://www.ptt.cc/bbs/MacDev/M.1414819471.A.44D.html http://stackoverflow.com/questions/6080406/setting-events-in-objective-c 好像有解了... ※ 編輯: HuangJC (175.180.127.76), 11/01/2014 13:29:37

11/01 16:35, , 1F
其實這應該像 runLoop, 但我上次學 runLoop 撞牆了..
11/01 16:35, 1F

11/01 16:36, , 2F
另外這篇的架構問題,算是解決了;整體已達流暢..
11/01 16:36, 2F

11/02 13:36, , 3F
何不用OperationQueue的方式把每一小塊的運算放進Queue裡?
11/02 13:36, 3F

11/02 13:37, , 4F
再配合Thread,每個Operation做完用Delegate回頭去處理顯示
11/02 13:37, 4F

11/02 13:38, , 5F
基本上CollectionView適合每個小塊會重複的動作....
11/02 13:38, 5F

11/02 13:39, , 6F
如果每個小區塊都不同...實在沒有用CollectionView的意義
11/02 13:39, 6F

11/02 20:57, , 7F
你是說,如果小區塊都不同,就乾脆全用 uiview 去組合?
11/02 20:57, 7F

11/02 20:58, , 8F
我的確是有用錯元件的感覺
11/02 20:58, 8F

11/03 21:11, , 9F
就原題來說,我另外找到一個解決方法了
11/03 21:11, 9F

11/03 21:12, , 10F
用 reloadItemsAtIndexPaths,這樣可以一個一個 cell 做
11/03 21:12, 10F

11/03 21:12, , 11F
因為我原本的抱怨是'一次全部都做,無法打斷'
11/03 21:12, 11F

11/03 21:13, , 12F
這逼使我把計算和顯示的 code 分離,以加快顯示
11/03 21:13, 12F

11/03 21:14, , 13F
但假設要先計算兩秒,看似沒動作,也是略有困擾..
11/03 21:14, 13F
文章代碼(AID): #1KL6wFHD (MacDev)