最近在做一個遊戲助手類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)
})
}
}
}