Re: [問題] Core Data Fetch與GCD的問題

看板MacDev作者 (zonble)時間13年前 (2012/09/11 23:00), 編輯推噓5(506)
留言11則, 5人參與, 最新討論串3/3 (看更多)
※ 引述《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

09/11 23:07, , 1F
麻煩的地方是,正在跑的operation根本沒辦法取消...
09/11 23:07, 1F

09/11 23:08, , 2F
可以,但是那個在跑的 operation 裡頭要跑 runloop
09/11 23:08, 2F

09/11 23:08, , 3F
咦,operation的話可能可以取消,只要有支援取消功能就
09/11 23:08, 3F

09/11 23:10, , 4F
可以......
09/11 23:10, 4F

09/11 23:11, , 5F
好像還有一種方法是在更新view前,檢查自己有沒有被cancel
09/11 23:11, 5F

09/11 23:13, , 6F
不過從operation當中查詢有沒有cancle,要小心ref cycle
09/11 23:13, 6F

09/11 23:15, , 7F
還好吧,問一下 [self isCancelled] 不就好了?
09/11 23:15, 7F

09/11 23:23, , 8F
對吼,如果是subclass 的話直接用self.isCancelled就好了
09/11 23:23, 8F

09/12 03:53, , 9F
謝謝Z大 我也是發現有這個問題 所以正在研究operation
09/12 03:53, 9F

09/12 08:52, , 10F
09/12 08:52, 10F

09/12 13:50, , 11F
不然也有個方法是GCD的時候用同一個queue也可以 比較簡單
09/12 13:50, 11F
文章代碼(AID): #1GJr8S4i (MacDev)
文章代碼(AID): #1GJr8S4i (MacDev)