我正在开发一款能够搜索91,000个条目的iPhone应用程序。我正在使用CoreData,它可以很好地工作,除了创建数据表大约需要2秒钟。我已将其编程为在后台进行搜索,并添加了一个微调器,但用户体验仍然不理想。我尝试使用FMDB,它运行良好,但速度不快。
基本上,我在swift中创建了我的xcdatamodel,添加了我的条目,它工作正常。 (下面的代码是徒手打字的,如果有拼写错误就很抱歉)
然后我创建了一个NSFetchedResultsController:
let moc =(UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
searchText: String? = "name contains[c] \"seachText\""
nsfr = NSFetchRequest(entityName: "Example")
nsfr.fetchBatchSize = 20
nsfr.predicate = NSPredicate(format: searchText!)
nsfrc = NSFetchedResultsController(fetchRequest: nsfr, managedObjectContext: moc, sectionNameKeyPath: "section", cacheName: nil)
然后在我的UITableViewController类中(符合NSFetchedResultsControllerDelegate):
nsfrc.delegate = self
nsfrc.performFetch()
self.tableView.reloadData()
有没有办法加快请求,比如哈希数据库?有什么方法可以将搜索缩小到单词的开头?我的数据包含数千个句子,我希望能够搜索其中的部分字符串。例如,“laz fo”应该找到“懒惰的棕色狐狸”。现在“azy own”也会找到字符串,这是不必要的。任何帮助,将不胜感激!即使将时间缩短一半也会很棒。
答案 0 :(得分:1)
FRC应该在100K记录中表现良好。但是,字符串解析 非常昂贵,因此根据您的数据可能存在性能问题。
您可以尝试将CONTAINS
替换为BEGINSWITH
进行优化,但这只会匹配整个name
字符串的开头。
或者,您可以创建一个新实体Word
并将它们置于Example
(例如titleWords
)的多对多关系中,并使用类似
NSPredicate(format: "ANY titleWords BEGINSWITH[c] %@", searchTerm)