看板 MacDev 關於我們 聯絡資訊
結果發生了神奇的事 原本我說即使把 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
HuangJC: 其實這應該像 runLoop, 但我上次學 runLoop 撞牆了.. 11/01 16:35
HuangJC: 另外這篇的架構問題,算是解決了;整體已達流暢.. 11/01 16:36
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
HuangJC: 你是說,如果小區塊都不同,就乾脆全用 uiview 去組合? 11/02 20:57
HuangJC: 我的確是有用錯元件的感覺 11/02 20:58
HuangJC: 就原題來說,我另外找到一個解決方法了 11/03 21:11
HuangJC: 用 reloadItemsAtIndexPaths,這樣可以一個一個 cell 做 11/03 21:12
HuangJC: 因為我原本的抱怨是'一次全部都做,無法打斷' 11/03 21:12
HuangJC: 這逼使我把計算和顯示的 code 分離,以加快顯示 11/03 21:13
HuangJC: 但假設要先計算兩秒,看似沒動作,也是略有困擾.. 11/03 21:14