Trabajando con reino y resultado JSON

Soy nuevo en el reino y estoy tratando de usar Reino en mi proyecto. Aquí estoy tratando de analizar JSON y savelo usando el reino. Cuando bash pasar por el error de la matriz de resultados

'Intento de modificar el object fuera de una transacción de escritura: llame a beginwritetransaction en una instancia de RLMRealm primero'

Este es el resultado de JSON:

{"data":[{"id":1,"parent_id":0,"name":"JenniferMaenle","title":"Ms","phone":"","address":"Toled, ohio","email":"jlmaenle@aol.com","image":"44381525_2017.jpg","relation_id":5,"created_at":null,"updated_at":"2017-08-10 02:30:05"},{"id":2, "parent_id":1,"name":"Khadeeja","title":"","phone":"","address":"","email":"","image":"Khadeeja_2017-07-17.jpg","relation_id":2,"created_at":null,"updated_at":"2017-07-17 08:3:12"}]} 

Estoy intentando analizar JSON y savelo en la database Realm. Aquí está mi bash:

 class Person: Object { dynamic var name = "" dynamic var title = "" dynamic var address = "" } override func viewDidLoad() { super.viewDidLoad() self.add() } func add(){ guard let data = dataFromFile("ServerData") else { return } let persons = Person() do { if let json = try JSONSerialization.jsonObject(with: data) as? [String: AnyObject] { if let data = json["data"] as? [[String:AnyObject]]{ for eachItem in data{ persons.name = eachItem["name"] as! String persons.title = eachItem["title"] as! String persons.address = eachItem["address"] as! String try! realm.write { realm.add(persons) } } } } } catch { print("Error deserializing JSON: \(error)") } } 

No modifique el object de las persons y agréguelo nuevamente al reino. El error que ve es porque agrega personas al reino y luego lo edita en la segunda iteración en el for eachItem in data nuevamente. Persons ya están agregadas al reino en esta iteración e intentan darle un nuevo nombre fuera de una transacción de escritura real. Es por eso que ves el error. Es mejor crear un nuevo object para cada persona.

 func add(){ guard let data = dataFromFile("ServerData") else { return } do { if let json = try JSONSerialization.jsonObject(with: data) as? [String: AnyObject] { if let data = json["data"] as? [[String:AnyObject]]{ for eachItem in data{ let persons = Person() persons.name = eachItem["name"] as! String persons.title = eachItem["title"] as! String persons.address = eachItem["address"] as! String try! realm.write { realm.add(persons) } } } } } catch { print("Error deserializing JSON: \(error)") } } 

Como indica el error, debe preformar la transacción dentro de una escritura,

Una opción es escribir a cada persona individualmente:

 for eachItem in data{ let person = Person() person.name = eachItem["name"] as! String person.title = eachItem["title"] as! String person.address = eachItem["address"] as! String try! realm.write { realm.add(person) } } 

La segunda opción es build un object y luego escribir:

 for eachItem in data{ let person = Person(); person.name = eachItem["name"] as! String person.title = eachItem["title"] as! String person.address = eachItem["address"] as! String persons.add(person) } try! realm.write { realm. append(persons) } 

Es posible que tenga que hacer algunos cambios a esto, pero esta es la idea.