2015-05-09 71 views
2

我的代码是这样的:核心数据:如何在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上采用的核心数据中。

+1

核心数据编程指南有关于“高效导入数据”的完整章节。那可能是一个开始的好地方... –

+1

我已经注意到了,但我不明白。对不起,因为我开始新编写swift代码。如果你有一个例子,它会更好。 –

+1

你最好学习如何至少阅读Objective-C。所有的框架仍然是用Objective-C编写的,如果你看不懂它们,你将会非常困难。现在消耗能量。 –

回答

2

该代码当前正在为每个新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函数的开始。

+0

非常感谢:) –

+0

@pbasdf,感谢您花时间回答这个问题题。高级用户只是说“自己去看看”或“先学Objective-C”或“不要求我为你做”。我们需要像这样更具体的Swift答案。 – Suragch