核心数据:如何在swift中将大型数组插入核心数据?

时间:2015-05-09 14:29:30

标签: ios swift core-data

我的代码如下:



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;
&#13;
&#13;

在上面的代码中,您可以看到我调用getProducts(moc)函数时。它正在逐一添加。我通过这种方式成功地将项目添加到核心数据。但速度有问题。它太慢,无法逐个添加例如20000个项目。我想知道是否还有另一种方法可以将数组直接添加到已经在rateDictionary中使用的核心数据中。

1 个答案:

答案 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函数的开头。