2016-05-19 86 views
0

閱讀JSON解析到NSArray中有用於從JSON填補領域數據庫的方法:段錯誤而迅速

func parseJSON(data: NSData) -> NSArray? { 
    do { 
     let array: NSArray = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as! NSArray 

     return array 
    } catch _ { 
     return nil 
    } 
} 
//parameter came from previous method 
func updateDatabaseFromParsedJson(parsedJson: NSArray) { 
    let realm = try! Realm() 
    try! realm.write { 
     realm.deleteAll() 
    } 
    for i in 0..<parsedJson.count { 
     let deviceObject = parsedJson[i] 

     let name = deviceObject["name"] as! String 
     let id = deviceObject["id"] as! Int 

     var device = Device() 
     device.name = name 
     device.id = id 
     try! realm.write { 
      realm.add(device) 
     } 
     var deviceMeasuresArray = deviceObject["measures"] as! NSArray 
     for i in 0..<deviceMeasuresArray.count { 
      var measureObject = deviceMeasuresArray[i] 
      var measure = Measure() 
      measure.slug = measureObject["name"] 
      measure.device = device 
      measure.localize() 
      try! realm.write { 
       realm.add(measure) 
      } 
      var measureEntriesArray = measureObject["averages"] as! NSArray 
      for i in 0..<measureEntriesArray.count { 
       var entryObject = measureEntriesArray[i] 
       var entry = PeriodAverage() 
       entry.measure = measure 
       entry.value = entryObject["value"] 
       entry.start = NSDate.parse(entryObject["start"]) 
       entry.end = NSDate.parse(entryObject["end"]) 
       entry.length = entryObject["length"] 
       try! realm.write { 
        realm.add(entry) 
       } 
      } 
     } 
    } 
} 

extension NSDate { 
    class func parse(dateString: String) -> NSDate { 

     let format = "yyyy-MM-dd'T'HH:mm:ss'Z'" 
     let formatter = NSDateFormatter() 
     formatter.dateFormat = format 
     return formatter.dateFromString(dateString)! 
    } 
} 

JSON本身http://188.166.51.200/api/v1/actual_data/

在編譯時,我得到錯誤Error:unable to execute command: Segmentation fault: 11

在哪裏我錯了,如何正確解析我的JSON?我認爲問題出現在json字段被強制解析爲對象的行中,但我是swift中的新成員,並且不能準確地確定錯誤。

+0

編譯時或應用程序運行時?你需要精確地確定你的問題在哪裏。您可以使用它的斷點,或添加日誌來知道在哪裏。 – Larme

回答

1

你明顯遇到了一個編譯器問題(你應該是report to Apple),儘管它很容易解決。如果您使用的是Swift,則應儘可能使用Swift集合類型,而不是Foundation集合類型(即Array而不是NSArray),以允許使用更多類型信息。另外,當你投射你從JSON中獲得的一些價值時,你並沒有全部投入。添加這些附加類型信息將使編譯器行爲並解決問題。我建議以下編輯:

func updateDatabaseFromParsedJson(parsedJson: Array<AnyObject>) { 
    let realm = try! Realm() 
    try! realm.write { 
     realm.deleteAll() 
    } 
    for i in 0..<parsedJson.count { 
     let deviceObject = parsedJson[i] as! Dictionary<String, AnyObject> 

     let name = deviceObject["name"] as! String 
     let id = deviceObject["id"] as! Int 

     var device = Device() 
     device.name = name 
     device.id = id 
     try! realm.write { 
      realm.add(device) 
     } 
     var deviceMeasuresArray = deviceObject["measures"] as! Array<AnyObject> 
     for i in 0..<deviceMeasuresArray.count { 
     var measureObject = deviceMeasuresArray[i] as! Dictionary<String, AnyObject> 
      var measure = Measure() 
      measure.slug = measureObject["name"] as! String // I'm guessing on the type here 
      measure.device = device 
      measure.localize() 
      try! realm.write { 
       realm.add(measure) 
      } 
      var measureEntriesArray = measureObject["averages"] as! Array<AnyObject> 
      for i in 0..<measureEntriesArray.count { 
       var entryObject = measureEntriesArray[i] as! Dictionary<String, AnyObject> 
       var entry = PeriodAverage() 
       entry.measure = measure 
       entry.value = entryObject["value"] as! String // Guessing on the type here also 
       entry.start = NSDate.parse(entryObject["start"] as! String) 
       entry.end = NSDate.parse(entryObject["end"] as! String) 
       entry.length = entryObject["length"] as! String // Again, guessing on the type here 
       try! realm.write { 
        realm.add(entry) 
       } 
      } 
     } 
    } 
} 

無關的編譯器的問題,你也可以使用,在循環,使你的代碼更Swift喜歡。您可以在The Swift Programming LanguageControl Flow一章的For-In Loops部分閱讀更多關於它們的內容。