【问题标题】:Filtering NSFetchedResultsController results at runtime在运行时过滤 NSFetchedResultsController 结果
【发布时间】:2011-04-04 15:19:49
【问题描述】:

使用 NSFetchedResultsController 实现 Core Data 对象运行时过滤的最佳方法是什么?

例如,我希望能够显示 RecordStore-entity 中的所有 Record-entities,但还希望针对某些预定义的条件过滤 RecordStore 中的所有 Record,例如(ANY recordStore.records.count > 0)。

我了解到在创建 NSFetchedResultsController 的谓词后更改它是不好的。那么我应该将获取的结果存储在一个可以过滤并将其用作 UITableView 的数据源的 NSArray 中,还是应该创建多个 NSFetchedResultsControllers?

【问题讨论】:

    标签: cocoa-touch core-data nsfetchedresultscontroller


    【解决方案1】:

    您可以在需要更新时重新获取数据。如果数据本身发生了变化,那么您可以再次调用 fetch。如果您的条件发生了变化,则在您的 NSFetchedResultsController 上设置谓词,然后调用 fetch。

    【讨论】:

    • 这意味着我将无法利用 NSFetchedResultsController 的内置缓存,据我了解,获取是一项非常昂贵的操作。
    • 获取并不是特别昂贵,特别是与将获取的对象数组永久保存在内存中相比,这是您在这种情况下的另一个选择。 NSFetchedResultsController 通常只对较大的、相对静态的表有用。不要去寻找你可能没有的性能问题。先使用最简单的解决方案,然后再使用更复杂的解决方案,只有在测试表明最简单的解决方案行不通之后。
    • NSFetchedResultsController 的 fetchRequest 属性是只读属性,所以我认为您不能更改谓词,因为它属于只读的获取请求。或者具体来说,您将如何编写代码?
    • @horseshoe7 NSFetchedResultsController 的 fetchRequest 属性是只读的,这意味着您不能设置 NSFetchRequest 的新实例。但是,请求的谓词属性是可写的,因此您可以简单地设置一个新的谓词并再次获取数据以获取更改。
    【解决方案2】:

    创建 NSFetchRequest 实例,每次更新请求并执行获取。如果您正在使用,请删除缓存:

        let shortDescriptor = NSSortDescriptor(key: key, ascending: ascending)
    
    
        fetchedResultViewController.fetchRequest.sortDescriptors = [shortDescriptor]
    
        NSFetchedResultsController<NSFetchRequestResult>.deleteCache(withName: fetchedResultViewController.cacheName)
    
        do {
            try fetchedResultViewController?.performFetch()
        } catch let error as NSError {
            print("Error in fetch \(error)")
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2019-03-22
      • 2020-01-02
      相关资源
      最近更新 更多