Возникают ошибки при сохранении данных с помощью Core Data

Я использую основные данные для сохранения данных моего приложения iOS. Его многопоточное приложение; Несколько потоков могут сохранять данные в Core Data DB. На самом деле, при сохранении данных с помощью Core Data возникают сбои.

Вот кусок кода, где выводятся ошибки:

 public func saveChanges()
{
    self.managedObjectContext.performBlock { () -> Void in

        if self.managedObjectContext.hasChanges {
            do {
                try self.managedObjectContext.save()
            } catch {
                //Handle Error
                //Handle Error, offcourse we will return after that
                print("======================================================")
                print("Error while saving 1rd tier context")
                print("------------------------------------------------------")

                let saveError = error as NSError

                print("Unable to Save Note")
                //print("\(saveError), \(saveError.localizedDescription)")

                let detailedErrors = saveError.userInfo[NSDetailedErrorsKey] as? [NSError]

                if let _ = detailedErrors {
                    for detailedError:NSError in detailedErrors! {
                        print("----------------------------------------")
                        print(" DetailedError:\(detailedError.userInfo)")
                        print("----------------------------------------")
                    }
                }

                print("------------------------------------------------------")
                print("\(saveError.localizedDescription)")
                print("======================================================")

                return
            }
        }
    }
}

Ниже приведены журналы на консоли (показаны краткие журналы):

 DetailedError:[Dangling reference to an invalid object.: <null>, NSValidationErrorValue: Relationship 'emails' on managed object (0x7ff2149f9220) <UserDB: 0x7ff2149f9220> (entity: UserDB; id: 0x7ff214a20270 <x-coredata:///UserDB/t45022E2A-2772-4525-8D96-929D1AC8FD7D8> ; data: {
addressBookContacts =     (
);
bio = nil;

И еще кое-что:

)}, NSAffectedObjectsErrorKey: (
"<Email: 0x7ff214d05c40> (entity: Email; id: 0x7ff214a6d420 <x-coredata:///Email/t45022E2A-2772-4525-8D96-929D1AC8FD7D9> ; data: {\n    emailRemovedByUser = nil;\n    \"email_address\" = nil;\n    \"email_type\" = nil;\n    id = 0;\n    \"is_verified\" = nil;\n    \"social_media_source\" = nil;\n    user = \"0x7ff214a20270 <x-coredata:///UserDB/t45022E2A-2772-4525-8D96-929D1AC8FD7D8>\";\n    visibility = 0;\n})"`), NSValidationErrorObject: <UserDB: 0x7ff2149f9220> (entity: UserDB; id: 0x7ff214a20270 <x-coredata:///UserDB/t45022E2A-2772-4525-8D96-929D1AC8FD7D8> ; data: {
addressBookContacts =     (

Также отображается «Висячая ссылка на недопустимый объект»; Я застрял с проблемой .. и не могу понять, почему это происходит.

Кто-нибудь наблюдал такую ​​проблему? Какие-либо предложения?


person msmq    schedule 14.03.2016    source источник


Ответы (1)


Очень опасно управлять Core Data из нескольких потоков.

У вас есть только 2 способа работы с CD:

  • Ограничение потока: все, что вы вызываете для чтения/записи основных данных, выполняется в одном потоке (обычно это основной поток).
  • Мультиконтекст: вы создаете один контекст управляемого объекта по потоку, но это действительно сложно, и вы не хотите этого делать.

Поэтому я рекомендую вам использовать основной поток для выполнения всех ваших вызовов. (и проверьте, действительно ли ваш контекст настроен в основном потоке)

person CZ54    schedule 14.03.2016
comment
Позвольте мне попробовать с ним. Спасибо за ваш ответ. - person msmq; 14.03.2016