我正在尝试浏览数据并将其保存在我的模型中,但无论我做什么,我都会遇到以下错误: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?
}
Run Code Online (Sandbox Code Playgroud)
码
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)
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
简化代码以仅显示一般结构有助于揭示问题:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
这是一系列事件:首先创建一个独立的,未加载的League实例league.对于每个匹配,您创建一个独立的,未加载的Match实例并将其追加到league.matches.然后创建一个写事务,并保存league到Realm.从这一点来说,league不再是独立的,并且只能在写入事务中进行修改.在循环的下一次迭代中,您将创建另一个Match实例并尝试将其追加到league.matches.这种抛出league是持久的,我们不在写事务中.
这里的一个解决方案是重构代码,这样你只需保存league到Realm一次,如下所示:
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)
}
Run Code Online (Sandbox Code Playgroud)
上面的帖子是错误的,你不能在写块之外改变领域模型的List.
正确的方法是:
try! realm.write {
league.matches.append(matchObject)
realm.add(league, update: true)
}
Run Code Online (Sandbox Code Playgroud)
至少这是Realm Version 0.98的常用方法
| 归档时间: |
|
| 查看次数: |
5517 次 |
| 最近记录: |