作者zonble (zonble)
看板MacDev
標題Re: [問題] Core Data Fetch與GCD的問題
時間Tue Sep 11 23:00:41 2012
※ 引述《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