NSFetchedResultsControllerDelegate не вызывается, когда данные больше не соответствуют предикату - PullRequest
0 голосов
/ 11 июня 2018

Проблема, которую я пытаюсь решить, заключается в следующем: предикат 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

Почему делегат не вызывается?

1 Ответ

0 голосов
/ 12 июня 2018

Поскольку ваш FRC настроен для выборки объектов CardIndex, он наблюдает только за изменениями этих объектов.Следовательно, он не будет реагировать на изменения в связанных объектах CardApplication.Вы можете либо намеренно «испачкать» CardIndex, что заставит FRC переоценить предикат, либо отказаться от FRC и использовать собственный наблюдатель для обновления вашего пользовательского интерфейса.

...