Realm将数据追加到List <t>types

我试图通过数据,并将其保存在我的模型,但无论我做我不断收到以下错误: Can't mutate a persisted array outside of a write transaction. 。 我究竟做错了什么? 我将每场比赛附加到联赛,但它似乎并没有工作?

领域模型

 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? } 

  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) } } } } } 

简化代码只显示一般结构有助于揭示问题:

 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) } } 

这是一连串的事件:你开始创build一个独立的,没有League实例, league 。 对于每场比赛,您创build一个独立的,未被执行的Match实例,并将其附加到league.matches 。 然后,您创build一个写交易,并将league保存到领域。 从这一点来看, league不再是独立的,只能在写交易中进行修改。 在循环的下一个迭代中,创build另一个Match实例,并尝试将其附加到league.matches 。 这是因为league是持续的,我们不是在写交易。

这里的一个解决scheme是重构代码,所以你只能把league保存到领域,就像这样:

 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) } 

上面的post是错误的,你不能在一个写块之外改变一个领域模型的列表。

正确的方法是:

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

至less这是Realm版本0.98的常用方法