El reino agrega datos a un tipo Lista <t>

Estoy tratando de revisar los datos y savelos en mi model; no obstante, hagas lo que sea que Can't mutate a persisted array outside of a write transaction. seguir recibo el siguiente error: Can't mutate a persisted array outside of a write transaction. . ¿Qué estoy haciendo mal? Estoy anexando cada partido a la liga, pero parece que no funciona.

model de reino

 class League: Object { dynamic var id: Int = 0 dynamic var name: String? = "" var matches = List<Match>() override class func primaryKey() -> String { return "id" } } class Match: Object { dynamic var matchId: Int = 0 dynamic var date: NSDate? dynamic var homeName: String? = "" dynamic var awayName: String? = "" dynamic var awayScore: Int = 0 dynamic var homeScore: Int = 0 dynamic var leagueName: String? = "" dynamic var homeLogo: NSData? dynamic var awayLogo: NSData? } 

Código

  for (_, item) in result { if let leagueId = item["league"].int, let leagueName = item["name"].string, let allMatches = item["matches"].array { let league = League() league.name = leagueName league.id = leagueId for match in allMatches { if let matchId = match["matchId"].int, let tournament = match["tournament"].string, let homeTeam = match["homeName"].string, let awayTeam = match["awayName"].string, let homeScore = match["homeScore"].int, let awayScore = match["awayScore"].int, let homeLogo = match["homeLogo"].string, let awayLogo = match["awayLogo"].string, let date = match["date"].string { if let awayLogoUrl = NSURL(string: awayLogo), let homeLogoUrl = NSURL(string: homeLogo) { if let awayLogoData = NSData(contentsOfURL: awayLogoUrl), let homeLogoData = NSData(contentsOfURL: homeLogoUrl) { let matchObject = Match() matchObject.matchId = matchId matchObject.leagueName = tournament matchObject.homeName = homeTeam matchObject.awayName = awayTeam matchObject.homeScore = homeScore matchObject.awayScore = awayScore matchObject.homeLogo = homeLogoData matchObject.awayLogo = awayLogoData let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" formatter.timeZone = NSTimeZone(abbreviation: "CET") matchObject.date = formatter.dateFromString(date)! league.matches.append(matchObject) } } } print(league) try! realm.write { realm.add(league, update: true) } } } } } 

Simplificar su código para mostrar solo la estructura general ayuda a revelar el problema:

 let league = League() league.name = leagueName league.id = leagueId for match in allMatches { if … { let matchObject = Match() … league.matches.append(matchObject) } print(league) try! realm.write { realm.add(league, update: true) } } 

Esta es la secuencia de events: Comienza creando una instancia de League independiente sin League , league . Para cada partido, crea una instancia de Match independiente y no league.matches y league.matches a league.matches . A continuación, crea una transacción de escritura y guarda la league en el Reino. A partir de este punto, la league ya no es independiente, y solo se puede modificar dentro de una transacción de escritura. En la siguiente iteración del ciclo, creas otra instancia Match e intentas league.matches a league.matches . Esto se dispara desde que se mantiene la league y no estamos en una transacción de escritura.

Una solución aquí sería reestructurar el código para que solo guardes una league al Reino una vez, así:

 let league = League() league.name = leagueName league.id = leagueId for match in allMatches { if … { let matchObject = Match() … league.matches.append(matchObject) } } print(league) try! realm.write { realm.add(league, update: true) } 

La publicación anterior es incorrecta, no puedes mutar una Lista de un model de reino fuera de un bloque de escritura.

la forma correcta sería:

 try! realm.write { league.matches.append(matchObject) realm.add(league, update: true) } 

Al less esta es la forma habitual con la versión Realm 0.98