核心数据以关系形式保存线程中的对象

时间:2015-11-03 12:46:21

标签: ios swift core-data

我有一个类Store,方法fetchProducts在后​​台运行,并从json数据中保存产品。

class Store: NSManagedObject {

       func fetchProducts(q: String) {
            ....
            let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
            dispatch_async(dispatch_get_global_queue(priority, 0)) {
                self.saveProduct(json_data)
            }
        }
    }

}

在这个课程中我有一个方法saveProduct来检查产品是否存在,然后该产品应该更新或创建新产品:

func saveProduct(data:[String: String]) -> Bool {
        var product:Product
        var products = self.products.allObjects as! [Product]
        if (self.managedObjectContext == nil) {
            return false
        }

        if (data["storeName"] != nil) {
           products = products.filter{ $0.storeName == data["storeName"] }
    } else {
        return false
    }

        let privateContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
        privateContext.persistentStoreCoordinator = self.managedObjectContext!.persistentStoreCoordinator

        if (data["storeName"] != nil) {
            products = products.filter{ $0.storeName == data["storeName"] }
        } else {
            return false
        }
        if products.count > 0 {
            product = products.first!
        } else {
            if let productEntity = NSEntityDescription.entityForName("Product", inManagedObjectContext: privateContext) {
                product = Product(entity: productEntity, insertIntoManagedObjectContext: privateContext)
            } else {
                return false
            }
        }

        product.setValue(data["storeName"], forKey: "storeName")
        product.setValue(data["storeType"], forKey: "storeType")
        product.setValue(self, forKey: "shopItem")
        privateContext.performBlockAndWait {
            do {
                try privateContext.save()
            } catch {
                fatalError("Failure to save context: \(error)")
            }

        }

        return true
    }

但我收到此行的错误:product.setValue(self, forKey: "shopItem")

  

非法尝试在对象之间建立关系   不同的背景

如何为产品保存fk字段?

1 个答案:

答案 0 :(得分:2)

如果您浏览product = products.first!,那么您将使用与“自我”相同的上下文中的原始产品。该上下文与privateContext不同,因此您的保存实际上并未持续更改。

如果您浏览product = Product(entity:...,那么您在privateContext中使用的新产品与self的上下文不同。

您应该做的是过滤当前线程并使用objectID查找privateContext中的匹配项,或者对privateContext进行过滤提取。通过这种方式,您始终拥有privateContext中的产品。然后,您需要使用self.objectIDself中获取privateContext,以便您可以更新关系并保存。

这是保持线程限制所必需的。

实际上,您还应该运行performBlock(或等待版本),以便上下文可以在其专用队列中运行逻辑。