核心数据:如何在swift中将巨大的数组插入核心数据?
我的代码是这样的:核心数据:如何在swift中将巨大的数组插入核心数据?
import Foundation
import CoreData
import UIKit
class BARCODEDIMENSION: NSManagedObject {
@NSManaged var barcode: String
@NSManaged var catid: Int32
@NSManaged var favorite: Bool
@NSManaged var name: String
@NSManaged var subcatid: Int32
class func getProducts(moc: NSManagedObjectContext) {
var url: NSURL! = NSURL(string: "link")
var request = NSURLRequest(URL: url)
var response: NSURLResponse ?
var error: NSError ?
var data: NSData ? = NSURLConnection.sendSynchronousRequest(request, returningResponse: & response, error: & error)
if let data: NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse: & response, error: & error) {
var parsingError: NSError ?
if
let rateDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: & parsingError) as ? NSArray {
for i in 0.. < rateDictionary.count {
let row: NSDictionary = rateDictionary[i] as!NSDictionary;
var name: String = row["name"] as!String
var catid: Int32 = Int32(row["catid"] !.integerValue)
var subcatid: Int32 = Int32(row["subcatid"] !.integerValue)
var barcode: String = row["barcode"] as!String
var favorite: Bool = false
insertBarcodeDimension(moc, barcode: barcode, catid: catid, favorite: favorite, name: name, subcatid: subcatid)
}
}
}
}
class func insertBarcodeDimension(moc: NSManagedObjectContext, barcode: String, catid: Int32, favorite: Bool, name: String, subcatid: Int32) - > BARCODEDIMENSION {
let newItem = NSEntityDescription.insertNewObjectForEntityForName("BARCODEDIMENSION", inManagedObjectContext: moc) as!BARCODEDIMENSION
newItem.barcode = barcode
newItem.name = name
newItem.catid = catid
newItem.subcatid = subcatid
newItem.favorite = favorite
var error: NSError ?
if (moc.save(& error)) {
println(error ? .localizedDescription)
}
return newItem
}
}
在上面的代码中,你可以看到,当我打电话的getProducts(MOC)的功能。它正在逐个添加。我通过这种方式成功地将项目添加到核心数据。但速度有问题。它的速度太慢,无法逐个添加20000个项目。我想知道是否有另一种方式直接将数组添加到已经在rateDictionary上采用的核心数据中。
该代码当前正在为每个新BarCodeDimension保存上下文。您应该批量更新。要做到这一点从insertBarcodeDimension
功能删除此代码:
var error: NSError ?
if (moc.save(& error)) {
println(error ? .localizedDescription)
}
,并把它而不是在为getProducts
循环中,insertBarcodeDimension...
通话后,在if语句,以确保它通过循环仅发生每隔X倍。
if i % 100 == 0 {
var error: NSError ?
if (moc.save(& error)) {
println(error ? .localizedDescription)
}
}
在这里,我使用的100 X的值,但调整通过试错这个数字权衡速度与内存占用。这可能会大大加快速度。
评论中引用的文档中的其他建议是将undoManager
设置为零。如果你有信心,你的moc
不需要撤消经理,然后修改其初始化你moc
包括代码:
moc.undoManager = nil
或者,如果它是更有利的,把它在getProducts
函数的开始。
非常感谢:) –
@pbasdf,感谢您花时间回答这个问题题。高级用户只是说“自己去看看”或“先学Objective-C”或“不要求我为你做”。我们需要像这样更具体的Swift答案。 – Suragch
核心数据编程指南有关于“高效导入数据”的完整章节。那可能是一个开始的好地方... –
我已经注意到了,但我不明白。对不起,因为我开始新编写swift代码。如果你有一个例子,它会更好。 –
你最好学习如何至少阅读Objective-C。所有的框架仍然是用Objective-C编写的,如果你看不懂它们,你将会非常困难。现在消耗能量。 –