fetchedResultsController不会更新过滤器

时间:2017-03-06 08:55:19

标签: ios swift core-data swift3 ios8

我有一个应用程序多语言。用户根据他/她选择的当前语言插入数据,例如:如果用户选择英语,那么他/她正在插入的数据将与语言英语链接,如果用户决定改变语言,例如,转到葡萄牙语然后插入新记录,当前记录将与葡萄牙语联系起来。到现在为止还挺好!

我的问题是:我有一个tableView,其中加载了一个列表,其中包含用户按语言(英语,葡萄牙语,意大利语,法语等)插入的记录,我使用核心数据(< strong> fetchedResultsController ),但问题是,列表并没有全部更新!!!它仅在我关闭应用程序并再次打开时才会更新。例如:我选择了英语语言打开应用程序,然后一切顺利,但是如果我决定将语言更改为葡萄牙语,那么我会回到列表视图,listView仍会显示英语列表

看起来与 fetchedResultsController 缓存的名称有关。在Apple的API参考中,它说:&#34;如果您正在使用缓存,则必须在更改任何获取请求,其谓词或其排序描述符之前调用deleteCache(withName :)。您不能为多个查询重复使用相同的获取结果控制器,除非您将cacheName设置为nil&#34; 所以我尝试删除缓存的名称并根据当前语言创建另一个名称,但不是幸运!我已经坚持了2天的问题,但仍然没有弄清楚。

这是我的 fetchedResultsController

 lazy var fetchedResultsController: NSFetchedResultsController<TranslationContainer> = {

    let fetchRequest = NSFetchRequest<TranslationContainer>()

    let entity = TranslationContainer.entity()
    fetchRequest.entity = entity

    let predicate = NSPredicate(format: "ANY dictionary.language == %@", "Portuguese")// it just update if I close the app and open
    fetchRequest.predicate = predicate

    let sortDescriptor = NSSortDescriptor(key: "word", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]

    fetchRequest.fetchBatchSize = 20

    let fetchedResultsController = NSFetchedResultsController(
        fetchRequest: fetchRequest,
        managedObjectContext: self.managedObjectContext,
        sectionNameKeyPath: nil,
        cacheName: nil)// it's nil here now, but I tried to change the cache's name based on the current language, but it didn't work either
    fetchedResultsController.delegate = self
    return fetchedResultsController
}()

1 个答案:

答案 0 :(得分:1)

fetchedResultsController仅监视其正在获取的实体的更改。因此,如果您有基于关系的谓词,它将正确执行初始提取,但在关系更新时不会更新。在您的情况下,如果字典的语言发生更改,则不会更新fetchedResultsController,因为没有更改TranslationContainer。

处理此问题的一种方法是在更改字典或语言时修改TranslationContainer上的属性。这将触发结果控制器重新评估对象。