MacDev 板


LINE

这阵子开发一个英汉字典的功能时 发现一些问题 主要是利用 UISearchDisplayController 来呈现搜寻字典的UI 在search时 并不是利用predicate来重新fetch 而是在fetchedObjects中找出最接近符合字串的index 并利用table view的-scrollToRowAtIndexPath:atScrollPosition:animated: 跳到搜寻到最接近的cell 这样User还是能在全部的字典内上下卷动浏览字库 搜寻流程总共含下面几个步骤: 1. 在UISearchBarDelegate的方法来触发搜寻字典功能 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ // 在有输入字串的情况下进行非同步搜寻 if (![searchText isEqualToString:@""]) { [self asyncSearchText:searchText]; } } 2. 进行非同步搜寻字串 - (void)asyncSearchText:(NSString*)text{ [self.operationQueue addOperationWithBlock:^{ [self searchText:text]; } } - (void)searchText:(NSString*)text{ // 利用NSArray的-indexOfObjectPassingTest: // 来对之前fetch出来的vocabularies进行字串比对搜寻 // 这边是简化的code,事实上我将字典依单字的字母开头分成A-Z 26个资料库 // 在search时,会依照字首来决定使用哪个fetchedObjects做进一步搜寻 // **fetchedObjects已经经过NSSortDescriptor的caseInsensitiveCompare:排序 NSArray *vocabularies = self.fetchedResultsController.fetchedObjects; // Problem 1: 请见後面讨论 NSInteger foundRow = [vocabularies indexOfObjectPassingTest: ^BOOL(id obj, NSUInteger idx, BOOL *stop) { // 将fetchedObjects中每个Vocabulary物件进行比对 Vocabulary *vocabulary = obj; NSComparisonResult comparisonResult = [vocabulary.word compare:text options:NSCaseInsensitiveSearch]; if (comparisonResult != NSOrderedAscending) { *stop = YES; return YES; } return NO; } // 获得indexPath NSIndexPath *foundIndexPath = [self foundIndexPathForFoundRow:foundRow forText:text]; // 通知更新searchResultsTableView [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self searchedText:text foundAtIndexPath:foundIndexPath]; }]; } 3. 更新searchResultsTableView - (void)searchedText:(NSString*)text foundAtIndexPath:(NSIndexPath*)indexPath{ // Problem 2: 请见後面讨论 [self.searchDisplayController.searchResultsTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; } 以上是简化的一个流程 以上程式码在搜寻时是可以work 但是当键盘输入过於快速时(大约超过每秒2个字母) 会发生以下问题: Problem 1: 当输入过於快速时 发现到async的operation会一直卡在isExecuting的状态 发现是卡在NSArray的-indexOfObjectPassingTest:里面出不来 不知道为什麽 朋友说试着改用suffix tree来做搜寻 (不过我还没研究...) 目前字串搜寻速度效率我可以接受 只不过不知道为什麽会发生这种情况... Orz Problem 2: 当输入过於快速时 会发生UI整个卡住不能动的情况 把-scrollToRowAtIndexPath:atScrollPosition:animate:给comment out就不会卡住 原本推测是前一个scroll的animation还没结束就实行下一个scroll造成 但是利用mainQueue 进行 serial operation 也是一样会卡(就是卷完一个再卷下一个) 我看其他字典软体的App都可以做出来我想要的结果 可是我遇到这些问题不知道该怎麽办 希望大家可以给一点意见.. --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.80.236.201
1F:推 tentenlee:动画关掉勒?? 09/23 00:59
2F:→ leondemon:动画关掉UI就不会卡 但是搜寻task卡住的问题还在 09/23 22:40







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP