Как CoreData NSManagedObject! = NIL, но не содержит никаких данных (данные: <fault>)? - PullRequest
0 голосов
/ 17 апреля 2020

Я столкнулся с довольно странной проблемой, когда использовал CoreData . Я получил расширение, которое сохраняет, и получает активный профиль , сохраненный в CoreData с помощью , используя UserDefaults для хранения активного профиля ObjectID .

extension NSPersistentContainer {
    private var managedObjectIDKey: String {
        return "activeUserObjectID"
    }

    var activeUser: Profile? {
        get {
            guard let url = UserDefaults.standard.url(forKey: managedObjectIDKey) else {
                return nil
            }

            guard let managedObjectID = persistentStoreCoordinator.managedObjectID(forURIRepresentation: url) else {
                return nil
            }

            return viewContext.object(with: managedObjectID) as? Profile
        }
        set {
            guard let newValue = newValue else {
                UserDefaults.standard.removeObject(forKey: managedObjectIDKey)
                return
            }

            UserDefaults.standard.set(newValue.objectID.uriRepresentation(), forKey: managedObjectIDKey)
        }
    }
}

В целом все это прекрасно работает, но потом я обнаружил очень странную ошибку. Пользователь может удалить профили (НО НЕ СОВРЕМЕННО АКТИВНО!)

Ошибка заключается в следующем: Как только я удаляю, например, Profile 2, пока Profile 1 активируется, как только удаление заканчивается, Profile 1 больше не активируется.

При попытке распечатать переменную activeUser возвращает только данные: ошибка вместо данные: { все данные } . Смотрите скриншот ниже:

Первая строка печатается перед удалением Profile 2, вторая строка печатается непосредственно после удаления профиля, а третья после повторной активации профиля печатается строка.

Я понятия не имею, что могло вызвать эту ошибку и потратить много времени на ее обнаружение, но не удалось.

Если у вас есть идеи, пожалуйста, дайте мне сейчас. Может ли ObjectID всех NSManagedObjects измениться после удаления одного? Или есть что-то еще, о чем я не думал?

Спасибо за вашу помощь заранее.

1 Ответ

0 голосов
/ 17 апреля 2020

Идентификатор объекта, показывающего <fault>, отличается от двух других. Если я правильно понял, ваша цель состояла в том, чтобы постоянно поддерживать один и тот же профиль, но, похоже, это не так, то есть что-то активирует другой профиль.

...