作者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
1F:推 dryman:麻烦的地方是,正在跑的operation根本没办法取消... 09/11 23:07
2F:→ zonble:可以,但是那个在跑的 operation 里头要跑 runloop 09/11 23:08
3F:→ dryman:咦,operation的话可能可以取消,只要有支援取消功能就 09/11 23:08
4F:→ dryman:可以...... 09/11 23:10
5F:→ dryman:好像还有一种方法是在更新view前,检查自己有没有被cancel 09/11 23:11
6F:→ dryman:不过从operation当中查询有没有cancle,要小心ref cycle 09/11 23:13
7F:→ zonble:还好吧,问一下 [self isCancelled] 不就好了? 09/11 23:15
8F:推 dryman:对吼,如果是subclass 的话直接用self.isCancelled就好了 09/11 23:23
9F:推 leondemon:谢谢Z大 我也是发现有这个问题 所以正在研究operation 09/12 03:53
10F:推 nobody1:推 09/12 08:52
11F:推 popcorny:不然也有个方法是GCD的时候用同一个queue也可以 比较简单 09/12 13:50