问题描述
我正在创建产品的核心数据对象,该产品还具有与多对多关系相关联的许多其他产品。
转换我的json im时,请检查该产品是否具有关联的产品,然后添加关系。
if let relatedItems = response["related"] as? [[String:Any]] {
// create the related items
for d in relatedItems {
let related = try createAssociatedFromresponse(response: d)
product.addToAssociatedProducts(related)
try self.managedobjectContext.save()
}
}
这会产生一个不稳定的错误-由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“不应同时修改对象和添加对象”
我尝试检查对象是否已经作为关系存在,但仍收到此错误。
编辑-将json转换为核心数据对象的完整代码
func createFromresponse(response: Dictionary<String,Any>) throws -> Product {
let productID = response["id"] as! NSNumber
var product: Product!
let fetchRequest: NSFetchRequest<Product> = Product.fetchRequest()
fetchRequest.predicate = nspredicate(format: "productID = %@",productID)
if let fetchedProduct = try self.managedobjectContext.fetch(fetchRequest).first {
product = fetchedProduct
} else {
product = (NSEntityDescription.insertNewObject(forEntityName: "Product",into: self.managedobjectContext) as! Product)
product.productID = productID
}
product.name = response["name"] as? String
product.ref = response["ref"] as? String
product.desc = response["description"] as? String
product.imageURL = response["image"] as? String
product.image = nil
product.thumbImageURL = response["thumb"] as? String
product.thumbImage = nil
product.pdfURL = response["pdf"] as? String
product.manufacturerUrl = response["manufacturer_url"] as? String
if let categoriesInHierarchy = response["categories"] as? NSArray
{
if categoriesInHierarchy.count == 3
{
if let topCategory = categoriesInHierarchy[0] as? [String:Any] {
product.topCategoryID = topCategory["id"] as? NSNumber
product.topCategoryName = topCategory["name"] as? String
}
if let subCategory = categoriesInHierarchy[1] as? [String:Any] {
product.subCategoryID = subCategory["id"] as? NSNumber
product.subCategoryName = subCategory["name"] as? String
}
if let bottomCategory = categoriesInHierarchy[2] as? [String:Any] {
product.bottomCategoryID = bottomCategory["id"] as? NSNumber
product.bottomCategoryName = bottomCategory["name"] as? String
}
}
}
if let relatedItems = response["related"] as? [[String:Any]] {
// create the related items
for d in relatedItems {
let related = try createAssociatedFromresponse(response: d)
product.addToAssociatedProducts(related)
}
try self.managedobjectContext.save()
}
return product
}
func createAssociatedFromresponse(response: Dictionary<String,into: self.managedobjectContext) as! Product)
product.productID = productID
}
product.name = response["name"] as? String
product.ref = response["ref"] as? String
product.desc = response["description"] as? String
product.imageURL = response["image"] as? String
product.image = nil
product.thumbImageURL = response["thumb"] as? String
product.thumbImage = nil
product.pdfURL = response["pdf"] as? String
product.manufacturerUrl = response["manufacturer_url"] as? String
if let categoriesInHierarchy = response["categories"] as? NSArray
{
if categoriesInHierarchy.count == 3
{
if let topCategory = categoriesInHierarchy[0] as? [String:Any] {
product.topCategoryID = topCategory["id"] as? NSNumber
product.topCategoryName = topCategory["name"] as? String
}
if let subCategory = categoriesInHierarchy[1] as? [String:Any] {
product.subCategoryID = subCategory["id"] as? NSNumber
product.subCategoryName = subCategory["name"] as? String
}
if let bottomCategory = categoriesInHierarchy[2] as? [String:Any] {
product.bottomCategoryID = bottomCategory["id"] as? NSNumber
product.bottomCategoryName = bottomCategory["name"] as? String
}
}
}
product.associatedProducts = nil
return product
}
解决方法
您可以将protected void RadGridIal_ItemCommand(object source,GridCommandEventArgs e)
{
//how to call and set the LabelOut text?
}
移到for循环之后吗?
try self.managedObjectContext.save()
编辑:
您如何在if let relatedItems = response["related"] as? [[String:Any]] {
// create the related items
for d in relatedItems {
let related = try createAssociatedFromResponse(response: d)
product.addToAssociatedProducts(related)
}
try self.managedObjectContext.save()
}
中创建对象?
编辑2:
您不应该在不同的线程中使用createAssociatedFromResponse
,将函数包装在NSManagedObjectContext
块中,如下所示:
perform