CoreData, что является причиной NSMergeConflict для NSManagedObject - PullRequest
0 голосов
/ 09 ноября 2019

Я испытываю такую ​​фатальную ошибку: (иногда это происходит не при каждом запуске приложения)

curl -X GET "http://image.tmdb.org/t/p/w185/fnjr5mJYERwICCB0Zhbkr8kucWi.jpg?" -i -v Успех (1 мс): Статус200 2019-11-09 19: 51: 13.502: изображение плаката -> подписано 2019-11-09 19: 51: 13.502: изображение плаката -> Событие следующее (ноль) Фатальная ошибка: неразрешенная ошибка Ошибка Домен = NSCocoaErrorDomain Code = 133020 "Не удалось объединить изменения. "UserInfo = {ликтList = (" NSMergeConflict (0x600001e06080) для NSManagedObject (0x6000028b2df0) с идентификатором объекта '0x8434ec0c3b730519' с oldVersion = 52 и newVersion = 52 \ old ners 100 * {61 = old id0 * 0 = {; old id0 * 0 = {; old id0 * 0 = {; old id0 * 0 = {; old id0 * 0 = {; старая идентификационная строка = 0;\ n Overview = \ "В погоне за идеальным Рождеством известные персонажи в сопровождении новых лиц сталкиваются с крошечными чудесами! Приключения, с которыми они сталкиваются, помогают им осознать, что самые важные вещи в жизни - надежда, принятие и семья - этов пределах их досягаемости и настоящая любовь - лучший рождественский подарок! \ "; \ n posterPath = \" / 7t64lJYNE9CHB820UUIrthHwruf.jpg \ "; \ n releaseaseDate = \ "2015-11-13 \"; \ n title = \ "Письма Санте 2 \"; \ n} и новая строка базы данных = {\ n id = 370291; \ n Overview = \ "В их стремлении кпрекрасное Рождество известные персонажи в сопровождении некоторых новых лиц переживают крошечные чудеса! Приключения, с которыми они сталкиваются, помогают им понять, что самые важные вещи в жизни - надежда, принятие и семья - в пределах их досягаемости, и что настоящая любовь - лучший рождественский подарок! \ "; \ N posterPath = \" / 7t64lJYNE9CHB820UUIrthHwruf.jpg \"; \ n releaseDate = \" 2015-11-13 \ "; \ n title = \" Письма Санте 2 \ "; \ n}"), NSExceptionOmitCallstacks = true}, ["threatList": <__ NSArrayM 0x60000056b1b0> (NSMergeConflict (0x600001e06080) для NSManagedObject (0x6000028b2df0) с objectID '0x8434ec0c3b730519' с oldVersion = 52 и newVersion = 52 и старой кэшированной строкой = {id = 370291; обзор = "В их стремлении к новым хорошо знакомым некоторые символы - в их стремлении к прекрасному Рождеству - новые лица сопровождались новыми известными персонажами - преследовавшими себя в поисках идеального Рождестваслучаются крошечные чудеса! Приключения, с которыми они сталкиваются, помогают им осознать, что самые важные вещи в жизни - надежда, принятие и семья - находятся в пределах их досягаемости и что настоящая любовь - лучший рождественский подарок! "; posterPath =" / 7t64lJYNE9CHB820UUIrthHwruf. jpg "; releaseDate =" 2015-11-13 "; title = "Письма Санте 2";} и новая строка базы данных = {id = 370291;Overview = "В погоне за идеальным Рождеством известные персонажи в сопровождении новых лиц сталкиваются с крошечными чудесами! Приключения, с которыми они сталкиваются, помогают им осознать, что самые важные вещи в жизни - надежда, принятие и семья - находятся в пределах их досягаемостии эта настоящая любовь - лучший рождественский подарок! ";posterPath = "/7t64lJYNE9CHB820UUIrthHwruf.jpg";releaseDate = "2015-11-13";title = "Письма Санте 2";}), "NSExceptionOmitCallstacks": 1]: файл / Users / michzio / Click5Interactive / Samples / MVVM в Swift / MVVM / MVVM / Data / CoreData / Interfaces / ICoreDataStorage.swift, строка 104 2019-11-09 19: 51: 13.503: запрос изображения плаката -> подписано 2019-11-09 19: 51: 13.503: загрузить изображение плаката -> подписано 2019-11-09 19: 51: 13.503: загрузить изображение плаката -> Событие следующее (ноль) 2019-11-0919: 51: 13.503938 + 0100 MVVM [21984: 2813376] Неустранимая ошибка: неразрешенная ошибка Ошибка Domain = NSCocoaErrorDomain Code = 133020 «Не удалось объединить изменения». UserInfo = {ликтList = ("NSMergeConflict (0x600001e06080) для NSManagedObject (0x6000028b2df0) с objectID '0x8434ec0c3b730519' с oldVersion = 52 и newVersion = 52 и старой кэшированной строкой = {\ n *01 = id = {\ n * 1001 = id;В погоне за идеальным Рождеством известные персонажи, сопровождаемые новыми лицами, испытывают крошечные чудеса! Приключения, с которыми они сталкиваются, помогают им осознать, что самое важное в жизни - надежда, принятие исемья - в пределах их досягаемости, и настоящая любовь - лучший рождественский подарок! \ "; \ n posterPath = \" / 7t64lJYNE9CHB820UUIrthHwruf.jpg \ "; \ n releaseDate = \" 2015-11-13 \ "; \ n title =\ "Письма Деду Морозу 2 \"; \ n} и новая строка базы данных = {\ n id = 370291; \ n Overview = \ "В погоне за идеальным Рождеством известные персонажи, сопровождаемые некоторыми новыми лицами, испытывают крошечные чудеса! Приключения, с которыми они сталкиваются, помогают им понять, что самые важные вещи в жизни - надежда, принятие и семья - в пределах их досягаемости, и что настоящая любовь - лучший рождественский подарок! \ "; \ N posterPath = \" / 7t64lJYNE9CHB820UUIrthHwruf.jpg \"; \ n releaseDate = \" 2015-11-13 \ "; \ n title = \" Письма Санте 2 \ "; \ n}"), NSExceptionOmitCallstacks = true}, ["threatList": <__ NSArrayM 0x60000056b1b0> (NSMergeConflict (0x600001e06080) для NSManagedObject (0x6000028b2df0) с objectID '0x8434ec0c3b730519' с oldVersion = 52 и newVersion = 52 и старой кэшированной строкой = {id = 370291; обзор = "В их стремлении к новым хорошо знакомым некоторые символы - в их стремлении к прекрасному Рождеству - новые лица сопровождались новыми известными персонажами - преследовавшими себя в поисках идеального Рождестваслучаются крошечные чудеса! Приключения, с которыми они сталкиваются, помогают им осознать, что самые важные вещи в жизни - надежда, принятие и семья - находятся в пределах их досягаемости и что настоящая любовь - лучший рождественский подарок! "; posterPath =" / 7t64lJYNE9CHB820UUIrthHwruf. jpg "; releaseDate =" 2015-11-13 "; title = "Письма Санте 2";} и новая строка базы данных = {id = 370291;Overview = "В погоне за идеальным Рождеством известные персонажи в сопровождении новых лиц сталкиваются с крошечными чудесами! Приключения, с которыми они сталкиваются, помогают им осознать, что самые важные вещи в жизни - надежда, принятие и семья - находятся в пределах их досягаемостии эта настоящая любовь - лучший рождественский подарок! ";posterPath = "/7t64lJYNE9CHB820UUIrthHwruf.jpg";releaseDate = "2015-11-13";title = "Письма Санте 2";}), "NSExceptionOmitCallstacks": 1]: файл / Users / michzio / Click5Interactive / Samples / MVVM в Swift / MVVM / MVVM / Данные / CoreData / Интерфейсы / ICoreDataStorage.swift, строка 104 curl -X GET "http://image.tmdb.org/t/p/w185/okTdaEgs0qdwHvqzAYOuHkmdwyI.jpg?" -i -v

Функция здесь insertReplacing () где источник этой ошибки:

 func insertReplacing(_ e: Entity) -> Observable<Entity> {

return Observable.create { observer -> Disposable in

    self.storage.persistentContainer.performBackgroundTask { [weak self] context in

        guard let self = self else { observer.onCompleted(); return }

        let request = ManagedObject.fetchRequest() as! NSFetchRequest<ManagedObject>
        request.predicate = NSPredicate(format: "id = %@", e._identifier)

        do {
            let result = try context.fetch(request)

            if result.count == 0 {
                // CREATE
                var object = ManagedObject(context: context)
                self.encode(entity: e, into: &object)
                self.storage.saveContext(context)

                observer.onNext(self.decode(object: object))
                observer.onCompleted()
            } else if result.count > 1 {
                observer.onError(CoreDataError.inconsistentState)
            } else {
                // REPLACE
                context.delete(result.last!)

                var object = ManagedObject(context: context)
                self.encode(entity: e, into: &object)
                self.storage.saveContext(context)

                observer.onNext(self.decode(object: object))
                observer.onCompleted()
            }
        } catch {
            observer.onError(CoreDataError.readError(error))
        }
    }

    return Disposables.create()
}

}

А вот функция saveContext ()

func saveContext(_ context: NSManagedObjectContext) {
        guard context != mainContext else {
            saveContext()
            return
        }

        context.performAndWait {
            do {
                try context.save()
            } catch let error as NSError {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }

            self.saveContext(self.mainContext)
        }
    }

и мой CoreDataStorage

class CoreDataStorage : ICoreDataStorage {

    static let shared = CoreDataStorage()

    private init() {}

    // MARK: - Core Data stack

    lazy var persistentContainer: NSPersistentContainer = {
        /*
         The persistent container for the application. This implementation
         creates and returns a container, having loaded the store for the
         application to it. This property is optional since there are legitimate
         error conditions that could cause the creation of the store to fail.
        */
        let container = NSPersistentContainer(name: "MVVM")

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

                /*
                 Typical reasons for an error here include:
                 * The parent directory does not exist, cannot be created, or disallows writing.
                 * The persistent store is not accessible, due to permissions or data protection when the device is locked.
                 * The device is out of space.
                 * The store could not be migrated to the current model version.
                 Check the error message to determine what the actual problem was.
                 */
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })

        container.viewContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
        container.viewContext.undoManager = nil
        container.viewContext.shouldDeleteInaccessibleFaults = true

        container.viewContext.automaticallyMergesChangesFromParent = true

        return container
    }()
}

и приходят свойства, определенные на ICoreDataStorage

public extension ICoreDataStorage {

    var isInMemoryStore : Bool { return false }

    var mainContext : NSManagedObjectContext {
        return self.persistentContainer.viewContext
    }

    var taskContext : NSManagedObjectContext {

        let context = self.persistentContainer.newBackgroundContext()
        context.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
        context.undoManager = nil

        return context
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...