Core data 当数据不再匹配谓词时,不调用NSFetchedResultsControllerDelegate

Core data 当数据不再匹配谓词时,不调用NSFetchedResultsControllerDelegate,core-data,nspredicate,nsfetchedresultscontroller,nsmanagedobject,Core Data,Nspredicate,Nsfetchedresultscontroller,Nsmanagedobject,我试图解决的问题如下:NSFetchedResultsController的谓词将结果限制在特定条件下。但当数据对象新满足或不满足条件时,不会调用NSFetchedResultsControllerDelegate 我的NSFetchedResultsController: private var _fetchedResultsController : NSFetchedResultsController<CardIndex>? = nil var fetchedResultCont

我试图解决的问题如下:NSFetchedResultsController的谓词将结果限制在特定条件下。但当数据对象新满足或不满足条件时,不会调用NSFetchedResultsControllerDelegate

我的NSFetchedResultsController:

private var _fetchedResultsController : NSFetchedResultsController<CardIndex>? = nil
var fetchedResultController : NSFetchedResultsController<CardIndex> {
    get {
        if _fetchedResultsController == nil {
            let fetchRequest: NSFetchRequest<CardIndex> = CardIndex.fetchRequest()
            fetchRequest.sortDescriptors = [NSSortDescriptor.init(key: "index", ascending: true)]
            fetchRequest.predicate = NSPredicate.init(format: "consumer == %@ AND card.definition != nil AND card.stateInt == 0", consumer)

            _fetchedResultsController = NSFetchedResultsController<CardIndex>.init(fetchRequest: fetchRequest, managedObjectContext: CDManager.shared.one.viewContext, sectionNameKeyPath: nil, cacheName: nil)
            do {
                try _fetchedResultsController?.performFetch()
            } catch {
                Log(.Warning, "...")
            }
            _fetchedResultsController?.delegate = self
        }

        return _fetchedResultsController!
    }
}
当NSFetchedResultsController最初提取数据时,它会正确返回设置了
定义的所有
CardApplication
s,并且
stateInt
的值为
0
。但是,当我在运行时将
stateInt
的值更改为与谓词条件不再匹配的另一个值时,不会调用NSFetchedResultsControllerDelegate来反映数据中的更改。我确保在更改
stateInt
值后保存了托管对象的上下文,我还可以看到上下文
在保存前发生了更改,并且
CardApplication
托管对象也显示了属性
changedValues()
上的更改。在保存更改之前,从调试器控制台,其中self是我更改的
CardApplication
对象
stateInt

(lldb) po managedObjectContext!.hasChanges
true

(lldb) po self.isUpdated
true

(lldb) po self.changedValues()
▿ 1 element
  ▿ 0 : 2 elements
    - key : "stateInt"
    - value : 1

为什么不调用委托?

由于FRC配置为获取CardIndex对象,它只观察这些对象的更改。因此,它不会响应对相关CardApplication对象的更改。您可以故意“弄脏”CardIndex,这将触发FRC重新计算谓词,也可以放弃FRC并使用您自己的观察者更新UI。

由于您的FRC配置为获取CardIndex对象,它只观察对这些对象的更改。因此,它不会响应对相关CardApplication对象的更改。您可以故意“弄脏”CardIndex,这将触发FRC重新评估谓词,或者放弃FRC,使用您自己的观察者更新您的UI。谢谢@pbasdf!这回答了我的问题。请您将您的评论作为回答,好吗?
(lldb) po managedObjectContext!.hasChanges
true

(lldb) po self.isUpdated
true

(lldb) po self.changedValues()
▿ 1 element
  ▿ 0 : 2 elements
    - key : "stateInt"
    - value : 1