SwiftCSV讀取CSV資料及初步封裝

Hydrogen發表於2016-06-03

最近在做一個遊戲助手類App,前期資料量較小,朋友幫忙抓取了一下裝備資料存在CSV檔案中,這裡簡單介紹一下SwiftCSV的安裝使用及簡單封裝

安裝

我們這裡使用Cocoapods安裝

target `Tk300HeroAssistant` do
    pod `SwiftCSV`

讀入CSV檔案

首先我們要讀入CSV檔案,建立一個CSV物件
首先我們從字串字面量來建立一個CSV物件

let csv = CSV(string: "id,name,age
1,Alice,18")

如果需要自定義分隔符可以這樣

let tsv = CSV(string: "id	name	age
1	Alice	18", delimiter: "	")

我們可以傳入路徑及檔名來讀取,可能會出錯,所以使用try catch來捕獲異常

// From a file (with errors)
do {
    let csv = try CSV(name: "users.csv")
} catch {
    // Catch errors or something
}

自定義換行符和編碼方式

do {
    let tsv = try CSV(name: "users.tsv", delimiter: tab, encoding: NSUTF8StringEncoding)
} catch {
    // Error handling
}

資料讀取

根據CSV的內容,寫出如下的Model類
實際應用不要用中文
實際應用不要用中文
實際應用不要用中文

import Foundation
class SkillData:NSObject {
    var id:String?
    var name:String?
    var 快捷鍵:String?
    var 冷卻時間:String?
    var 技能消耗:String?
    var Information:String?
}

資料讀取是一個需要時間的過程,所以我們用GCD來在非同步執行緒進行讀取,通過一個回撥函式來獲取我們的資料,並且封裝一個通用的讀取方法

import Foundation
import SwiftCSV
class CSVReader {
    /**
     CSV讀取
     
     - parameter fileName:         檔名
     - parameter completionHandle: completionHandle
     */
    class func loadDataFromCSV<T:NSObject>(fileName:String,completionHandle:([T])->Void){
        //非同步讀取
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
            let filePath = NSBundle.mainBundle().pathForResource(fileName, ofType: "csv")
            let csvURL = NSURL(fileURLWithPath: filePath!)
            do{
                let csv = try CSV(url: csvURL)
                let dataArray = csv.rows.map({ (dic:[String:String]) -> T in
                    let data = T()
                    dic.forEach({ (key,value) in
                        data.setValue(value, forKey: key)
                    })
                    return data
                })
                dispatch_async(dispatch_get_main_queue(), {
                    completionHandle(dataArray)
                })
            }catch{
                completionHandle([])
            }
        })
    }
}

隨後我們在一個Manager類中建立業務相關的讀取方法

import Foundation
class CSVDataManager{
    static let sharedInstance = CSVDataManager()
    var skillDataArray:[SkillData]?
    func loadSkillData(completionHandle:([SkillData])->Void) {
        if let data = skillDataArray{
            completionHandle(data)
        }else{
            CSVReader.loadDataFromCSV("skill data", completionHandle: { (data:[SkillData]) in
                self.skillDataArray =  data
                completionHandle(data)
            })
        }
    }
}

相關文章