2016-04-27 42 views
0

假设我有来自Web服务API的一千条记录,并且我想在privateContext中的核心数据中添加这些记录。我怎样才能同时进行而不是线性进行。在CoreData中同时插入iOS

我能将像dispatch_apply

let entity:NSEntityDescription = NSEntityDescription.entityForName(entityName, 
      inManagedObjectContext:managedContext)! 
let managedObject:NSManagedObject = NSManagedObject(entity: entity, 
      insertIntoManagedObjectContext: managedContext) 

同时运行?

+0

您可以使用dispatch_async,performBlock(在managedContext中)。但是,不要每次都保存上下文,一旦完成所有插入操作,请执行保存上下文。 –

+0

我的问题有点不同....我想做同时插入。例如我想要在10个不同的队列中并行插入100条记录。 –

+0

从这篇文章(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Concurrency.html)看来,您似乎需要为每个队列使用不同的专用队列上下文。如果你得到它的工作,我想知道底层数据库是否允许并行更新或自己序列化。 –

回答

0

试试这个:

func persistAsyncInContext<T:AnyObject>(parentContext:NSManagedObjectContext , objetcsFromJSON:[T] , completion:()->Void){ 

    let workQ = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT) 
    let workGroup = dispatch_group_create() 

    for objectFromJSON in objetcsFromJSON{ 

     dispatch_group_enter(workGroup) 
     let workerChildMoc = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType) 
     workerChildMoc.parentContext = parentContext 
     workerChildMoc.performBlock{ 

      let managedObject = NSEntityDescription.insertNewObjectForEntityForName("entityName", inManagedObjectContext: workerChildMoc) 
      //if objectFromJSON is also an array then loop it and move the line above that creates new object into the loop. 

      do 
      { 
       try workerChildMoc.save() 
      } 
      catch 
      { 
       //Handle error 
      } 
      defer{ 
       dispatch_group_leave(workGroup) 
      } 
     } 
    } 

    dispatch_group_notify(workGroup, dispatch_get_main_queue()) {() -> Void in 
     do{ 
      try parentContext.save() 
     } 
     catch 
     { 
      //Handle error 
     } 
     //End of persist 
     completion() 
    } 
} 

这在儿童方面所创建的每个对象并保存它们,但考虑到考虑到这样做了很多对象的效率不高,你可能要创建一个二维数组的JSON对象(例如,如果您有1000个对象,则将它们分块为10个100个对象的数组,并在10个子上下文中解析10个数组的异步)。

希望它有帮助。