作者zonble (zonble)
看板MacDev
标题Re: [问题] 在Obj-C 下做搜寻字串的功能
时间Wed Sep 26 22:40:50 2012
※ 引述《leondemon (狗狗)》之铭言:
: 以上是简化的一个流程 以上程式码在搜寻时是可以work
: 但是当键盘输入过於快速时(大约超过每秒2个字母) 会发生以下问题:
: Problem 1:
: 当输入过於快速时 发现到async的operation会一直卡在isExecuting的状态
: 发现是卡在NSArray的-indexOfObjectPassingTest:里面出不来 不知道为什麽
: 朋友说试着改用suffix tree来做搜寻 (不过我还没研究...)
: 目前字串搜寻速度效率我可以接受 只不过不知道为什麽会发生这种情况... Orz
我们不能够确定 NSArray 的 indexOfObjectPassingTest: 里头
有没有 lock,搞不好同时有两个 thread 一起 enumerate 资料
会造成什麽东西被卡住。
我觉得可以先尝试在建立一笔新的 async 搜寻的时候,先把前面
所有的 operation 先统统清掉在加入到 operation queue。
对 self.operationQueue 呼叫一下 cancelAllOperations 看看。
或是把 operation queue 允许的 operation 设成 1,一个 operation
做完才能做下一个。
: Problem 2:
: 当输入过於快速时 会发生UI整个卡住不能动的情况
: 把-scrollToRowAtIndexPath:atScrollPosition:animate:给comment out就不会卡住
: 原本推测是前一个scroll的animation还没结束就实行下一个scroll造成
iOS 里头有动画的元件,动画都需要 0.25 秒的时间,如果这一个
动画还没做完就去呼叫另外一个动画,往往会出问题,像是
navigation controller 还在 push 的时候就要求 pull,就会导致
整个 navigation 路径乱掉。
一种作法是,我们可以把所有的 scroll 动作,再包成一个 operation
丢到另外一个 operation queue 里头,而不是直接丢到 main thread
做事。这个 operation queue 一次只允许一个 operation,里头每个
operation 在要求 main thread 更新 UI 之後,再 sleep 个 0.25
秒,或是跑个 0.25 秒的 runloop,确保所有的动画都有足够的时间。
不过这麽做,应该就会感觉 UI 的反应速度赶不上打字的速度。
--
zonble.net
cocoa.zonble.net
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 36.229.55.22
1F:推 leondemon:谢谢Z大 不过cancelAllOperations好像不会取消执行中的 09/28 17:57
2F:→ leondemon:设立queue的瓶颈 感觉又很不responsable 不过我会试试看 09/28 17:59
3F:→ leondemon:UI部分 我再用设queue的瓶颈加cancelAllOperations试试 09/28 18:00
4F:→ leondemon:不过很想知道有没有更好的作法 :( 09/28 18:00
5F:推 dryman:你可以试试Omni group的OFTrie 或是 NDTrie 09/29 10:08
6F:→ dryman:直接改资料结构对搜寻速度应该会很有帮助 09/29 10:08
7F:推 dryman:还有一招是core data batching 但这我没用过.. 09/29 10:55