【问题标题】:iOS - Show item lists from RealmiOS - 显示来自 Realm 的项目列表
【发布时间】:2017-02-01 16:00:03
【问题描述】:

我正在从 SERVER_URL 下载数据并保存到本地数据库 - 领域。 我正在尝试显示此数据库列表中的项目,但出现错误。我会很感激一些提示。

Alamofire.request(SERVER_URL).responseJSON { response in

      let items = [Item].from(jsonArray: response.result.value as! [Gloss.JSON])
         print(items?[0] as Any)

        for item in items! {

            let itemRealm = ItemRealm()
            itemRealm.id = item.id!
            itemRealm.name = item.name!
            itemRealm.desc = item.descr!
            itemRealm.icon = item.icon!

            try! self.realm.write {
                self.realm.add(itemRealm)
            }
        }
    }

    let items = realm.objects(ItemRealm.self)
    print(items[0])

错误 -> 将我引导至 AppDelegate 类..... -> Thread1: signal SIGABRT

控制台错误日志:

2017-02-01 16:51:20.701 iOSRecruitmentTest[15958:982747] * 由于未捕获的异常“RLMException”而终止应用程序,原因:“索引 0 超出范围(必须小于 0)” * 首先抛出调用栈:.... libc++abi.dylib:以 NSException 类型的未捕获异常终止 (lldb)

【问题讨论】:

    标签: ios swift realm alamofire


    【解决方案1】:

    let items = realm.objects(ItemRealm.self)responseJSON 闭包之前被调用。

    不要忘记网络代码通常是异步运行的!将您的代码放在闭包中,它应该被修复。

    顺便说一句,如果可以的话,还要尝试限制realm.write 的数量,在这个例子中,你可以通过以下方式轻松实现:

    Alamofire.request(SERVER_URL).responseJSON { response in
    
      let items = [Item].from(jsonArray: response.result.value as! [Gloss.JSON])
         print(items?[0] as Any)
    
        // !! Only one write transaction
        try! self.realm.write {
            for item in items! {
                let itemRealm = ItemRealm()
                itemRealm.id = item.id!
                itemRealm.name = item.name!
                itemRealm.desc = item.descr!
                itemRealm.icon = item.icon!
                self.realm.add(itemRealm)
            }
        }
    
        // !! This code is now inside the closure
        let itemRealms = realm.objects(ItemRealm.self)
        print(itemRealms[0])
    }
    

    【讨论】:

    • 我不得不将 let items = realm.objects(ItemRealm.self) 转换为 _ = self.realm.objects(ItemRealm.self) 因为我遇到了定义与先前值冲突的错误。这似乎可行,但是当我想再次重新运行该应用程序时,它给了我与以前相同的错误,因此我必须杀死它并重新运行一个。所以它只适用于第一次。感谢您的输入。关闭后我应该以某种方式删除数据吗?
    • 我已经编辑了我的答案:因为您不想打印 json 结果,所以您想打印领域对象。我不完全知道您要达到什么目的,但如果您遇到这样的错误,我鼓励您安全地解开可选项 并添加一些错误案例。如果响应为空,使用实际代码,应用程序将崩溃。
    • 好的,谢谢。这很有帮助。我正在使用简单的列表和使用领域作为数据库进行一些测试。我认为崩溃的问题可能是因为我将网络连接放在了 viewDidLoad() 中。如果我错了,请纠正我。现在我认为通过阅读错误日志:数据已保存,因此当我重新运行应用程序时,它会再次下载并且“id”= 0 已经存在。这将解释崩溃。
    • 这可能是一个解释。如果您正在下载对象的更新,那么您可能有兴趣更新该对象,而不是尝试将其插入到领域数据库。您可以通过在添加对象时将 update 标志设置为 true 来实现。示例:realm.add(itemRealm, update: true)
    • 像魅力一样工作。再次感谢您在考虑我的问题时花时间和投入回答。
    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    相关资源
    最近更新 更多