【问题标题】:Core Data: How to insert huge arrays to core data in swift?核心数据:如何将巨大的数组快速插入核心数据?
【发布时间】:2015-07-20 09:20:59
【问题描述】:

我的代码是这样的:

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 上已经采用的核心数据中。

【问题讨论】:

  • 核心数据编程指南有一整章是关于“高效导入数据”的。这可能是一个很好的起点......
  • 我已经读过,但我不明白。抱歉,因为我开始在 swift 上编写代码。如果有例子就更好了。
  • 你最好学习如何至少阅读 Objective-C。所有的框架仍然是用 Objective-C 编写的,如果你不能阅读它们,你将很难过。现在就消耗能量。
  • 你说的都是真的,但现在我应该紧急去做这就是我在这里问的原因。 Objective-C 或 Swift 也不是我的工作。我只是在尝试一些东西。在这个小项目之后,我不想再看它了。正如我所说,这很紧急,所以如果你能帮助我,谢谢你。
  • 这个网站是为寻求帮助解决问题的人准备的。它不是一个供人们为您编写代码的网站。如果你懒得花精力去学习它,那我们为什么还要费心去帮助你呢?

标签: ios swift core-data


【解决方案1】:

代码当前正在保存每个新 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)
    }
}

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

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

moc.undoManager = nil

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

【讨论】:

  • @pbasdf,感谢您抽出宝贵时间回答这个问题。高级用户只是说“自己去看看”或“先学习 Objective-C”或“不要让我为你做”。我们需要像这样更具体的 Swift 答案。
猜你喜欢
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
相关资源
最近更新 更多