2016-05-19 3 views
0

Существует метод, используемый для заполнения базы данных области действия из JSON:Сегментация Ошибка при чтении JSON парсер для NSArray в быстрой

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 нравится. Подробнее о них вы можете узнать в разделе For-In Loops раздела Control Flow от The Swift Programming Language.

Смежные вопросы