Realm 将数据追加到类型 List

2024-03-23

我正在尝试遍历数据并将其保存在我的模型中,但是无论我做什么,我都会收到以下错误: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?
}

Code

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

这是事件的顺序:首先创建一个独立的、非持久的League实例,league。对于每场比赛,您都会创建一个独立的、非持久的Match实例并将其附加到league.matches。然后您创建一个写入事务并保存league到王国。从这一点来说,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)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Realm 将数据追加到类型 List 的相关文章

  • 在 UIScrollview 上显示缩略图的最佳方法是什么(从服务器下载)

    我想在 UIScrollview 如照片应用程序 上显示许多图像 作为缩略图 所有图像将从服务器下载 据我所知 有几种选择 1 通过创建 UIImageviews 然后将它们添加为主滚动视图上的子视图 2 通过子类化一个UIView类 然后
  • Apple Mach-O 链接器错误(静态,不是 ld)

    我最近遇到了 Apple Mach O 链接器错误 大多数指南建议将 构建设置 中的位码更改为 否 但它仅适用于 ld 错误 这与我的不同 我会提供截图 请帮忙修复bug pod HandySwift 导致了错误的出现 这是它的 Githu
  • 无法在 ios 应用程序中通过 googlecast 正确投射视频

    我正在开发一个基于 AVPlayer 的自定义视频播放器项目 尝试整合谷歌演员 我已经根据谷歌图进行了集成 https codelabs developers google com codelabs cast videos ios http
  • 如何使用 CNContacts 快速获取手机号码?

    我有一些代码可以检索用户联系人中的所有电话号码 但只想过滤掉手机号码 目前 我只是通过将第一个数字为 或第二个数字为 7 的数字添加到数组中来实现此目的 如下所示 func findContacts gt CNContact let key
  • 如何使用 alamofire 通过基本身份验证上传图像?

    我正在尝试使用 alamofire 4 7 1 和此代码上传图像 但说实话 我怀疑我没有编写正确的代码来上传图像 func uploadDefect defectRemark String defectLocation String def
  • 如何为 iPhone 6+、6 和 5 指定不同尺寸?

    我想让 iPhone 6 6 和 5 上的视图看起来几乎相同 在附图中 我的意思是 例如 取消 按钮在 iPhone 5 中距离屏幕左边缘应为 30 像素 在 6 中为 35 像素 在 6 中为 45 像素 其他元素也类似 如何为每种类型设
  • iPhone X 将对象底部与安全区域对齐会破坏其他设备上的外观

    关于 iPhone X 自动布局怪癖的问题 我有两个按钮 以前这些按钮将与超级视图底部对齐 偏移量为 20 以免它们接触屏幕底部 此后我将链接更改为安全区域而不是超级视图 Here s the original setup Looks go
  • jQuery:离线后 POST 出错(iOS 和 Chrome)

    我构建了一个具有离线功能的 HTML5 Web 应用程序 使用 AppCache 程序流程为 Online 在网络上时 应用程序预加载一些基本信息 工作 Offline 用户拿着装有应用程序的平板电脑offline 然后在应用程序上执行他们
  • UIViewController 不旋转到横向

    在许多情况下需要旋转控制器但不起作用 现在我遇到了相反的问题 它正在旋转 我想禁用它 在那个 ViewController 中我有这个 BOOL shouldAutorotateToInterfaceOrientation UIInterf
  • 将类型传递给通用 Swift 扩展,或者理想情况下推断它

    说你有 class Fancy UIView 你想找到所有兄弟姐妹Fancy意见 没问题 https stackoverflow com q 37232743 294884 for v UIView in superview subview
  • 在 WKWebView 中禁用缩放?

    有谁知道在 WKWebView 中禁用双击和捏缩放的简单方法 我尝试过的任何方法都不起作用 Webview scrollView allowsMagnification false Error value of type WKWebView
  • 如何使用phonegap在iOS应用程序中防止键盘推送webview

    当屏幕底部的输入字段获得焦点时 键盘会向上推我的网络视图 并且页面的上部不再可见 我想防止键盘推高网络视图 有人有主意吗 对焦 设置window scrollTo 0 0 这可以防止键盘完全推高 webview input on focus
  • AVAudioPlayer 无法从网站播放 m4a 或 mp3 文件类型

    我试图在我的应用程序中找到一个仅纯 m4a 声音的 URL 我有音频的 URL 理论上可以下载它 然后 使用下载的文件URL到声音 我尝试使用AVAudioPlayer播放它 但它不播放任何声音 这是我的代码 在 URL 检索函数中 我调用
  • 在 iOS 上使用 RNCryptor 异步解密大文件

    我需要在 iOS 上使用 RNCryptor 异步解密一个大文件 以便显示进度条 我在任何地方都找不到示例 因此尝试了我猜对的方法 但是 我想出的方法不起作用 解密器的处理程序从未被调用 并且线程在发送所有数据后因 EXC BAD ADDR
  • NSPredicate IN 从数组元素查询

    对于一个古怪的标题表示歉意 我有一个 Int 数组 我想定义一个 NSPredicate 来过滤掉 connectionType 等于数组中包含的值的项目 所以基本上是这样的 fetchRequest predicate NSPredica
  • 在 SwiftUI 中使用可观察对象切换视图

    我正在练习尝试使用 SwiftUI 中的可观察对象切换视图 但我的代码无法正常工作 我知道我可以用 State 来做到这一点 但我想用可观察的对象来实现这一点 当我单击内容视图中的图像时 图像不会改变 有人能帮我吗 内容视图 swift i
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • ios8 键盘高度有所不同

    我使用下面的代码来获取键盘高度 该高度在带有 ios8 的 iPhone 5s 设备中与带有 ios7 的 IPhone4s 设备中有所不同 因此 当我在带有 ios8 的 iPhone5s 中点击它时 我的文本字段移动得非常高 而相同的代
  • Mac 上的 Delphi - 可能吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我负责一个 Delphi Win32 项目管理应用程序 我刚刚完成了向 Delphi 2009 的迁移
  • 所有 RestKit 项目在归档时都无法构建

    这个问题涉及RESTKIT 0 9 x 如果您是 Restkit 新手 请考虑使用较新的版本0 10 x https github com RestKit RestKit tree v0 10 1 branch 我最近继承了一个项目 使用r

随机推荐

  • 使图像完全填充div而不拉伸

    我有不同尺寸的大图像 需要在两个尺寸上完全填充 240 像素 x 300 像素的容器 这是我现在得到的 仅适用于一维 http jsfiddle net HsE6H http jsfiddle net HsE6H HTML div clas
  • SVG 异物大小不一致

    我正在尝试在 SVG 中创建 2 个 html 对象 并在 Vis js 图表中进一步使用它们 我的第一个 svg 按钮 按预期工作并且看起来不错 我的问题是 当我尝试插入表格 div 时 宽度 高度不是我设置的值 这是我得到的 正如您所看
  • 为输入范围生成红色和绿色之间的颜色[重复]

    这个问题在这里已经有答案了 可能的重复 基于数字的颜色编码 https stackoverflow com questions 5533297 color coding based on number 我希望用户能够从 1 100 的范围内
  • 如何在 Nest js 中使用 fastify-adapter 配置速率限制

    我刚刚开始实现 API 的 Nest js 并且正在使用 Fastify 适配器 我需要帮助在 Nest JS 中使用 FastifyAdapter 配置速率限制 async function bootstrap const app awa
  • 对 super 的调用必须是构造函数中的第一个语句,但它是

    我不断收到错误消息 调用 super 必须是构造函数中的第一个语句 问题是它is我的构造函数中的第一条语句 public void CheckingAccountCustomer int a super n p b accountNo a
  • 将简单的 MFC CView/CDocument/CSingleDocTemplate 应用程序转换为 ActiveX 控件

    我有一个相当简单的 MFC 应用程序 它只定义了自己的子类CDocument CView and CFrameWnd并通过使用它们CSingleDocTemplate在视图的树中显示文档的只读内容 都是非常标准的MFC MVC 我现在需要转
  • TreeSet 如何检查重复项

    我正在检查 TreeSet 如何检查重复元素并具有以下代码 import java util public class TreeDemo public static void main String args new TreeDemo go
  • 两个 Perl 脚本之间的 cgi 会话

    我在我的网站中使用了两个 Perl 脚本 我在侧面有一个搜索字段 它调用第一个脚本 结果写入输出文件中 下一次单击时 用户调用第二个脚本 该脚本读取输出文件并根据用户搜索构建配置文件 目前我只在输出文件上写入 但我需要使用会话 ID 来个性
  • 文字运算符模板:为什么不是字符串?

    再次 在回答另一个问题时 我忘记了 我的错 仅当找到整数或浮点文字时 才会从声明集中选取文字运算符模板 举个例子 template
  • 节点/fastify 出现错误,不支持的媒体类型:application/x-www-form-urlencoded

    index js fastify get paynow request reply gt let data TXN AMOUNT 10 request amount ORDER ID ORDER 123455 any unique orde
  • 如何在 MacOS Sierra 上安装 pymssql

    Command usr bin python u c import setuptools tokenize file private tmp pip build J1I0ox pymssql setup py f getattr token
  • IEnumerator 移回记录

    我有一个要求 我必须有记录来回 所以我使用 IEnumerator 来实现这一点 但我可以通过 movenext 前进 但无法后退 这是一种可以包装的方法IEnumerator
  • Rails,在form_for标签自定义文本中插入span标签

    我的问题是我想插入一个 span tag in form for label自定义文本 在正常的 html 代码中 它会是这样的 span
  • FBSDKGraphRequest 使用未声明的标识符

    虽然我已经导入了 FacebookSDK 例如 import
  • 403 - 禁止:访问被拒绝。 ASP.Net MVC [重复]

    这个问题在这里已经有答案了 可能的重复 IIS 7 中的 ASP MVC 导致 HTTP 错误 403 14 禁止 https stackoverflow com questions 1741439 asp mvc in iis 7 res
  • 用 INSERT / UPDATE 的单个查询替换循环

    我正在 PostgreSQL 中编写一个函数 它基本上执行 3 个步骤 从源表中获取一条记录 检查目标表中提取的记录的值 如果在目标表中找到记录 则使用提取的记录更新目标表的所有值 否则将提取的记录插入目标表 如果我写 而不是做这个循环单一
  • 防止多次点击按钮

    我有以下 jQuery 代码来防止双击按钮 效果很好 我在用Page ClientValidate 确保仅当页面有效时才阻止双击 如果存在验证错误 则不应设置标志 因为没有启动到服务器的回发 有没有更好的方法来防止在页面加载回来之前第二次单
  • 无法创建新的 Chrome 远程会话

    我正在尝试使用 Selenium Grid 启动新的 Chrome 浏览器 但最终出现以下错误 无法创建新的远程会话 所需功能 功能 browserName chrome version 55 0 2 platform WINDOWS 所需
  • 如何重命名 Excel 工作表?

    我有一个场景 我想更改电子表格中工作表的名称 我尝试使用创建电子表格ss Workbook 我认为这是用名为 Sheet 的工作表创建电子表格 我尝试使用以下格式更改工作表的名称 ss sheet ss get sheet by name
  • Realm 将数据追加到类型 List

    我正在尝试遍历数据并将其保存在我的模型中 但是无论我做什么 我都会收到以下错误 Can t mutate a persisted array outside of a write transaction 我究竟做错了什么 我将每场比赛附加到