【问题标题】:CoreData search too slowCoreData 搜索太慢
【发布时间】:2015-10-18 14:51:21
【问题描述】:

我正在开发一个搜索 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”应该找到“The lazy brown fox”。现在“azy own”也会找到字符串,这不是必需的。任何帮助,将不胜感激!即使将时间减半也很棒。

【问题讨论】:

    标签: ios swift sqlite search core-data


    【解决方案1】:

    FRC 应该在 100K 记录时表现得非常好。但是,字符串解析 开销很大,因此根据您的数据可能会出现性能问题。

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

    或者,您可以创建一个新实体Word 并将它们放入Example 的一对多关系中(例如titleWords)并使用谓词如

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

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      相关资源
      最近更新 更多