【问题标题】:iOS Filter NSFetchedResultsController EfficientlyiOS 高效过滤 NSFetchedResultsController
【发布时间】:2011-06-19 02:25:36
【问题描述】:

我正在尝试将搜索支持添加到支持 UITableViewCore Data 并开始遇到一些性能问题。我目前与两个NSFetchedResultsController 有关联(一个用于常规,一个用于搜索)。在我的UISearchDisplayDelegate 方法中,我在每次调用后释放并重新创建我的NSFetchedResultsController。但是,这会导致打字时出现延迟!有没有更有效的方法来过滤NSFetchedResultsController?我已将批量大小设置为大约 50 个项目,如果这有所不同,我的数据库有几千条记录。谢谢!

【问题讨论】:

    标签: iphone cocoa-touch xcode core-data ipod-touch


    【解决方案1】:

    是的,你可以:

    创建 NSFetchRequest 实例并每次更改其排序描述符:

     let shortDescriptor = NSSortDescriptor(key: key, ascending: ascending)
        request.sortDescriptors = [shortDescriptor]
    
        do {
            try fetchedResultViewController?.performFetch()
        } catch let error as NSError {
            print("Error in fetch \(error)")
        }
    

    阅读苹果文档:https://developer.apple.com/reference/coredata/nsfetchedresultscontroller

    【讨论】:

      【解决方案2】:

      我使用下面的代码来过滤 FetchedResultController 的结果

      NSPredicate *pre = [NSPredicate predicateWithFormat:@"attribute CONTAINS [cd] %@", searchString];
      NSArray *searchResults = [[self.fetchedResultsController fetchedObjects] filteredArrayUsingPredicate:pre]
      

      希望有帮助!

      【讨论】:

      • UITableView必须逐行更新时,不能使用此方法。
      【解决方案3】:

      NSFetchedResultsController documentation 很清楚:

      • 如果有缓存,删除它。
      • 更新fetchRequest 属性。请注意,您不能简单地修改现有的 fetch 请求;您必须创建一个新的。
      • 致电-executeFetch:

      【讨论】:

      • 考虑到每次都执行 fetch 的新调用,这是否比重新创建 NSFetchedResultsController 更有效?
      • 至少,您没有每次创建和销毁NSFetchedResultsController 的开销。所以,虽然我没有任何指标来衡量它的效率多少,但它应该是。
      • 谢谢。我会试一试,但看起来我可能需要添加一些异步代码(并延迟获取)才能真正解决这个问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多