2015-10-18 209 views
0

我正在研究通过91,000个条目搜索的iPhone应用程序。我使用的是CoreData,它的工作原理非常漂亮,除了需要大约2秒来创建数据表。我将它编程为在后台执行搜索,并添加了一个微调器,但用户体验仍然不理想。我尝试使用FMDB工作正常,但没有更快。CoreData搜索速度太慢

本质上,我创建了我的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”也会找到字符串,这不是必需的。任何帮助,将不胜感激!即使将时间缩短一半也会很棒。

回答

1

FRC应该在100K记录中表现得非常好。然而,字符串解析昂贵,所以根据您的数据可能会有性能问题。

您可以尝试通过将CONTAINS替换为BEGINSWITH来尝试进行优化,但这只会匹配整个name字符串的开头。

或者,你可以创建一个新的实体Word并付诸的Example(例如titleWords)一个一对多的关系,并使用谓词像

NSPredicate(format: "ANY titleWords BEGINSWITH[c] %@", searchTerm)