看板 MacDev 關於我們 聯絡資訊
※ 引述《leondemon (狗狗)》之銘言: : 推 dryman:跟view相關的要丟到main queue裡面做 09/11 06:50 : → dryman:你可以把tableView reloadData那行用dispatch_async 09/11 06:51 : → dryman:dispatch_get_main_queue() 包起來 09/11 06:51 : 謝謝D大幫我解決了 App開啟時load data的問題 : 但是目前遇到了另外一個狀況: : 我做了一個字典的功能 並用searchBar可以搜尋單字 然後如法炮製(如下) : 結果是cell.textLabel.text的資料是有更新 : 但畫面上的table cell卻沒有更新 : 變成要手動捲動table view時cell的textLabel才會更新 : 當我打"b"的時候 tableView第一個cell 依然是A開頭的字 : 當我打"bo"的時候 tableView第一個cell 是b : 當我打"boy"的時候 tableView第一個cell 指出現是bo : 也就都是上一個搜尋的結果 : 請問這個問題要怎麼解決呢? : ===== : 自問自答: : 我忘了實際顯示的table不是原來的那一個 : 應該是searchDisplayController.searchResultsTableView 的這個tableView做reload 順便提一下,其實像這種 case,其實用 NSOperationQueue 會 比較好。主要原因是,用 GCD 做非同步的工作的時候,後面加進去 的工作並不會取消前一個工作。 也就是,一般來說,b 開頭的字會比 bo 更多,所以當 bo 的搜尋 結果出來的時候,b 還不見得會跑完,結果會造成先顯示了 bo 的 搜尋結果先跑出來,結果又被 b 的搜尋結果換掉。 比較好的作法是包裝成 operation 丟進 operation queue 中, 而在丟進 queue 之前,先把 queue 裡頭目前存在的 operation 都先 cancel 掉。 -- zonble.net cocoa.zonble.net -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.224.8.104
dryman:麻煩的地方是,正在跑的operation根本沒辦法取消... 09/11 23:07
zonble:可以,但是那個在跑的 operation 裡頭要跑 runloop 09/11 23:08
dryman:咦,operation的話可能可以取消,只要有支援取消功能就 09/11 23:08
dryman:可以...... 09/11 23:10
dryman:好像還有一種方法是在更新view前,檢查自己有沒有被cancel 09/11 23:11
dryman:不過從operation當中查詢有沒有cancle,要小心ref cycle 09/11 23:13
zonble:還好吧,問一下 [self isCancelled] 不就好了? 09/11 23:15
dryman:對吼,如果是subclass 的話直接用self.isCancelled就好了 09/11 23:23
leondemon:謝謝Z大 我也是發現有這個問題 所以正在研究operation 09/12 03:53
nobody1:推 09/12 08:52
popcorny:不然也有個方法是GCD的時候用同一個queue也可以 比較簡單 09/12 13:50