2017-06-18 68 views
0

这个现有的对象重复的对象是克隆现有对象的代码,但它在行sourceSet.enumerated()CoreData - 如何创建具有迅速

func clone(source:NSManagedObject,context:NSManagedObjectContext) -> NSManagedObject{ 
     let entityName = source.entity.name 
     let cloned = NSEntityDescription.insertNewObject(forEntityName: entityName!, into: context) as! IZExperiment 
     //loop through all attributes and assign then to the clone 
    let attributes = NSEntityDescription.entity(forEntityName: entityName!, in: context)?.attributesByName 
    for (attrKey, _) in attributes! { 
     cloned.setValue(source.value(forKey: attrKey), forKey: attrKey) 
    } 


    //Loop through all relationships, and clone them. 
    let relationships = NSEntityDescription.entity(forEntityName: entityName!, in: context)?.relationshipsByName 
    for (relKey, relValue) in relationships! { 
     if relValue.isToMany { 
      let sourceSet = mutableOrderedSetValue(forKey: relKey) 
      let clonedSet = (copy() as AnyObject).mutableOrderedSetValue(forKey: relKey) 
//    let enumerator = sourceSet.enumerated() 


      for (_,relatedObject) in sourceSet.enumerated() 
      { 
       let clonedRelatedObject = (relatedObject as! NSManagedObject).shallowCopy() 
       clonedSet.add(clonedRelatedObject!) 

      } 

     } else { 
      cloned.setValue(value(forKey: relKey), forKey: relKey) 
     } 
    } 
    return cloned 
} 



extension NSManagedObject { 
    func shallowCopy() -> NSManagedObject? { 
     guard let context = managedObjectContext, let entityName = entity.name else { return nil } 
     let copy = NSEntityDescription.insertNewObject(forEntityName: entityName, into: context) 
     let attributes = entity.attributesByName 
     for (attrKey, _) in attributes { 
      copy.setValue(value(forKey: attrKey), forKey: attrKey) 
     } 
     return copy 
    } 
} 
+1

到底是什么错误?你能复制并粘贴在控制台上打印的内容吗? –

回答

0

其他坠毁的(_,则relatedObject),比一些小错误,你有一个很大的问题:你忘记将克隆对象的关系设置为新创建的克隆集。 另外,我建议创建一个clonedSet清洁的解决方案:

let clonedSet = Set(sourceSet.map {($0 as! NSManagedObject).shallowCopy()!}) 
cloned.setValue(clonedSet, forKey: relKey) 

的小错误: 您是在稀薄的空气中调用mutableOrderedSetValue(forKey:)value(forKey:)。在适当的对象上调用它们。

例如,mutableOrderedSetValue(forKey: relKey)

source.mutableOrderedSetValue(forKey: relKey)代替或者,shallowCopy FUNC里面的self.value(forKey: attrKey)代替value(forKey: attrKey)

+0

感谢SimSim我会尽力检查 –