使用背景上下文时,无法在不同上下文中的对象之间建立关系

时间:2018-12-31 12:12:08

标签: ios swift xcode core-data

我正在尝试通过背景上下文插入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 ()
                }
            }


    }

我只有两个实体,位置和图像。位置具有称为位置的属性,图像具有称为图像的属性。它们之间存在一对多的关系(一个位置可以包含许多图像)。

我知道每个上下文都保留自己的NSManagedObjects副本。这就是为什么在代码中,我首先根据视图上下文获取一个Image,获取其ID,然后使用该ID在背景上下文中获取一个Image对象。

我在做什么错?

我是Core Data的新手,所以我将不胜感激能为我解释这里发生的事情以及如何解决它的任何帮助。

更新:问题在于建立在视图上下文上的imagesLocation,所以我只是使用它在后台上下文中的ID从该对象创建了一个对应的对象。之后,问题得以解决,但是像问题here一样,我在Image对象和关系方面也遇到了问题。我可以解决这个问题,我发布了答案,您可以检查一下。

1 个答案:

答案 0 :(得分:1)

playerVars: {'origin':'https://mywebsite.com/'}似乎是在外来线程上创建的NSManagedObject,因此无法分配给self.imagesLocation

您应该使用imageOnBackgroundContextself.imagesLocation中获取backgroundContext指向的对象,并将获取的对象分配给NSManagedObjectID