我的代码如下:
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
}
}
&#13;
在上面的代码中,您可以看到我调用getProducts(moc)函数时。它正在逐一添加。我通过这种方式成功地将项目添加到核心数据。但速度有问题。它太慢,无法逐个添加例如20000个项目。我想知道是否还有另一种方法可以将数组直接添加到已经在rateDictionary中使用的核心数据中。
答案 0 :(得分:3)
代码当前正在为每个新的BarCodeDimension保存上下文。您应该批量更新。为此,请从insertBarcodeDimension
函数中删除此代码:
var error: NSError ?
if (moc.save( & error)) {
println(error ? .localizedDescription)
}
并在getProducts
调用后的insertBarcodeDimension...
for循环中将其置于if语句中,以确保它在循环中每隔X次发生一次。
if i % 100 == 0 {
var error: NSError ?
if (moc.save( & error)) {
println(error ? .localizedDescription)
}
}
这里我使用的X值为100,但是通过反复试验来调整这个数字,以便将速度与内存占用量进行权衡。这可能会大大加快速度。
评论中提到的文件中的另一个建议是将undoManager
设置为零。如果您确信自己的moc
不需要撤消管理员,请修改初始化moc
的代码以包含:
moc.undoManager = nil
或者如果它更方便,请将其放在getProducts
函数的开头。