试试这个:
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个数组的异步)。
希望它有帮助。
您可以使用dispatch_async,performBlock(在managedContext中)。但是,不要每次都保存上下文,一旦完成所有插入操作,请执行保存上下文。 –
我的问题有点不同....我想做同时插入。例如我想要在10个不同的队列中并行插入100条记录。 –
从这篇文章(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Concurrency.html)看来,您似乎需要为每个队列使用不同的专用队列上下文。如果你得到它的工作,我想知道底层数据库是否允许并行更新或自己序列化。 –