我有一个类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字段?
答案 0 :(得分:2)
如果您浏览product = products.first!
,那么您将使用与“自我”相同的上下文中的原始产品。该上下文与privateContext
不同,因此您的保存实际上并未持续更改。
如果您浏览product = Product(entity:...
,那么您在privateContext
中使用的新产品与self
的上下文不同。
您应该做的是过滤当前线程并使用objectID
查找privateContext
中的匹配项,或者对privateContext
进行过滤提取。通过这种方式,您始终拥有privateContext
中的产品。然后,您需要使用self.objectID
在self
中获取privateContext
,以便您可以更新关系并保存。
这是保持线程限制所必需的。
实际上,您还应该运行performBlock
(或等待版本),以便上下文可以在其专用队列中运行逻辑。