Невозможно установить связь между объектами в разных контекстах при использовании фонового контекста. - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь вставить NSManagedObject через фоновый контекст и получаю эту ошибку:

Illegal attempt to establish a relationship 'location' between objects in different contexts (source = <Image: 0x600002f81b80> (entity: Image; id: 0x600000f44fe0 <x-coredata:///Image/t8C3934D6-DCD7-4A7B-A69C-9C18334F7A942> ; data: {
    image = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe10058 45786966 00004d4d 002a0000 00080002 01120003 00000001 0001>;
    location = nil;
}) , destination = <Location: 0x600002fb3020> (entity: Location; id: 0xd78dad45136e9365 <x-coredata://9CA497CF-69A8-44ED-8741-C75AF480446E/Location/p2> ; data: {
    images = "<relationship fault: 0x600000f44480 'images'>";
    location = "29.977646364835238,31.32489065578125";
}))

Я знаю, что этот вопрос задавался несколько раз, я проверил некоторые изответы, но я действительно не мог знать, чего не хватает в моем коде.Вот мой код:

func saveImagesToDb () {

            //Store the image in the DB along with its location on the background thread
            dataController.backgroundContext.perform {
                let imageOnMainContext = Image (context: self.dataController.viewContext)
                let imageManagedObjectId = imageOnMainContext.objectID
                let imageOnBackgroundContext = self.dataController.backgroundContext.object(with: imageManagedObjectId) as! Image

                for downloadedImage in self.downloadedImages {

                    let imageData = NSData (data: downloadedImage.jpegData(compressionQuality: 0.5)!)
                    imageOnBackgroundContext.image = imageData as Data
                    imageOnBackgroundContext.location = self.imagesLocation


                    try? self.dataController.backgroundContext.save ()
                }
            }


    }

У меня просто есть два объекта: Местоположение и Изображение.Местоположение имеет атрибут с именем location, а Image имеет атрибут с именем image.Между ними существует отношение «один ко многим» (в одном месте может быть много изображений).

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

Что я делаю неправильно?

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

Обновление : проблема была в imagesLocation, который был построен на контексте представления, поэтому я просто создал соответствующий объект, используя его идентификатор в контексте фона.После этого проблема была решена, но у меня также была проблема с объектом Image и отношениями, как в моем вопросе здесь .Я мог решить это, и я отправил ответ, вы можете проверить это.

1 Ответ

0 голосов
/ 31 декабря 2018

Кажется, что self.imagesLocation является NSManagedObject, созданным во внешнем потоке, и поэтому не может быть назначен на imageOnBackgroundContext.

. Вы должны получить объект, на который указывает self.imagesLocation, вваш backgroundContext, используя его NSManagedObjectID и назначить этот выбранный объект вашему imageOnBackgroundContext

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