gpt4 book ai didi

ios - 核心数据 : How to insert huge arrays to core data in swift?

转载 作者:可可西里 更新时间:2023-11-01 01:06:00 31 4
gpt4 key购买 nike

我的代码是这样的:

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 的 for 循环中,在 insertBarcodeDimension... 调用之后,在 if 语句中以确保它仅在整个过程中每 X 次发生一次循环。

if i % 100 == 0 {
var error: NSError ?
if (moc.save( & error)) {
println(error ? .localizedDescription)
}
}

在这里我使用了 100 的 X 值,但通过反复试验调整这个数字以权衡速度与内存占用。这可能会大大加快速度。

评论中提到的文档中的另一个建议是将 undoManager 设置为 nil。如果您确信您的 moc 不需要撤消管理器,请修改初始化您的 moc 的代码以包括:

moc.undoManager = nil

或者,如果更方便,将其放在 getProducts 函数的开头。

关于ios - 核心数据 : How to insert huge arrays to core data in swift?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30141108/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com