iOS-显示域中的项目列表

iOS-显示域中的项目列表,ios,swift,realm,alamofire,Ios,Swift,Realm,Alamofire,我正在从服务器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

我正在从服务器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…->线程1:信号SIGABRT

控制台错误日志:

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

您的
让items=realm.objects(ItemRealm.self)
responseJSON
关闭之前被调用

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

另一方面,还要尝试限制
领域的数量。如果可以,请编写
,在本例中,您可以通过执行以下操作轻松实现:

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结果,所以你想打印realm对象。我不知道你到底想实现什么,但是如果你有这样的错误,我鼓励你安全地打开选项并添加一些错误案例。如果响应为空,使用实际代码,应用程序将崩溃。好的,谢谢。这很有帮助。我正在使用简单列表和使用领域作为数据库进行一些测试。我认为崩溃的问题可能是因为我已将网络连接置于viewDidLoad()中。如果我错了,请纠正我。现在我通过阅读错误日志来思考:数据已经保存,所以当我重新运行应用程序时,它会再次下载,并且“id”=0已经存在。这就解释了坠机的原因。这可能是一个解释。如果您正在下载对象的更新,那么您可能会对更新对象感兴趣,而不是尝试将其插入领域数据库。您可以通过在添加对象时将update标志设置为true来实现这一点。示例:
realm.add(itemRealm,update:true)
就像一个符咒。再次感谢您在考虑我的问题时给予我的时间和投入。