2017-07-19 1 views
0

Ceci est la fonction de jeuEnregistrer JSON dans userDefaults

func setSelectedDivisions(_ division:[Division]) { 

    if (division.count != 0) { 
     self.userDefaults.set(division.toJSONString(), forKey: "selectedDivisions") 
     self.userDefaults.synchronize() 
    } 
    else{ 
     self.userDefaults.removeObject(forKey: "selectedDivisions") 
     self.userDefaults.synchronize() 
    } 
} 

et c'est la fonction get

func getSelectedDivisions() -> [Division] { 

    if let json = self.userDefaults.value(forKey: "selectedDivisions"){ 
     print(json) 
    } 

    if let json = self.userDefaults.value(forKey: "selectedDivisions") as? Array<Dictionary<String, Any>> { 
     if json.count != 0{ 
      let divisions = Mapper<Division>().mapArray(JSONArray: json) 
      if divisions.count != 0{ 
       return divisions 
      } 
     } 
    } 
    return [] 
} 

en fonction get j'ai eu erreur m'a dit que mon sérialisation est faux. c'est le JSON i essayer de l'obtenir

[{ "name": "أ", "img": "http://www.smsalmaali.com/images/cclass/21.jpg", "name2": "الصف الاول", "id1": "21", "id2": "1"}]

une idée pour le résoudre?

+0

de toute façon est mauvaise approche utiliser les usersDefaults pour maintenir de grandes quantités de données –

+0

ce n'est pas trop grand .. et je suis obligé de l'utiliser –

Répondre

1

Je pense que cette ligne de code est erroné

if let json = self.userDefaults.value(forKey: "selectedDivisions") as? Array<Dictionary<String, Any>> 

vous devez d'abord convertir la chaîne JSON en objet de tableau, comme suit

let data = (self.userDefaults.value(forKey: "selectedDivisions") as! String).data(using: String.Encoding.utf8) as NSData? 
     if data == nil || data!.length == 0 { 
      return 
     } else { 
      do { 
       let resultJSON = try JSONSerialization.jsonObject(with: data! as Data, options: .mutableContainers) 
       if let json = resultJSON as? Array<Dictionary<String, Any>> { 
        // do something 
       } 
     } catch _ { 
      print("exception ") 
     }