2015-05-09 66 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