Проблема, которую я пытаюсь решить, заключается в следующем: предикат 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!
}
}
Структура данных, которая уместна здесь (только псевдокод):
class CardIndex {
@NSManaged public var index: Int16
@NSManaged public var consumer: String?
@NSManaged public var card: CardApplication?
}
class CardApplication {
@NSManaged public var title: String?
@NSManaged public var indexes: NSSet?
@NSManaged public var stateInt: NSNumber?
@NSManaged public var definition: CardDefinition?
}
Когда NSFetchedResultsController изначально выбирает данные, он корректно возвращает все CardApplication
с установленным definition
, а stateInt
имеет значение 0
.Но когда я изменяю значение stateInt
во время выполнения на другое значение, которое больше не соответствует условию предиката, NSFetchedResultsControllerDelegate не вызывается, отражая это изменение в данных.Я убедился, что сохранил контекст управляемого объекта после изменения значения stateInt
, и я также вижу, что контекст hasChanges
перед сохранением и управляемый объект 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
Почему делегат не вызывается?