【问题标题】:Realm accessed from incorrect thread using async and await使用 async 和 await 从不正确的线程访问领域
【发布时间】:2022-01-17 15:09:55
【问题描述】:

运行下面的代码我得到“从不正确的线程访问的领域”。第二个try! realm.write({ 行出错,第一个写入行不会导致错误。关于如何修复它的任何想法?

let realm = try! await Realm()
                        print("User Realm User file location: \(realm.configuration.fileURL!.path)")
                        try! realm.write { // <= No error here
                            realm.add(groups, update: .modified)
                        }
                        StartApp._Groups = groups
                        if let items  = await api.getArticles(aricleIDs: ids) {
                            try! realm.write({ // <= Error here
                                realm.add(items, update: .modified)
                            })
                            StartApp._Items = items
                            var index = 0
                            StartApp._Items = StartApp.Items.map { item in
                                item.i = index
                                index = index + 1
                                return item
                            }
                            groups.forEach { group in
                                group.items = items.filter({ $0.groupId == group.id })
                            }
                        }

【问题讨论】:

  • 试试? realm.write({ realm.add(items, update: .modified) }) 试试这样
  • 你为什么要这样做await Realm()?通常等待是为了查询或读取能够异步处理数据,请参阅Async/Await Query MongoDB。它确实取代了function.async 方法调用。哦,这个await api.getArticles 之后的闭包是一个不同的线程——记住是异步的并且是独立运行的。
  • @Jay 我正在使用的版本中默认构造函数使用await
  • @Jay 第二次关闭你的意思是第二次realm.write ?
  • 我改成这个:let realm = try! Realm(queue: .main) 然后我得到一个 NSError

标签: swift async-await realm


【解决方案1】:

我修复了以下内容,删除了 await Realm() 并将写入合并为一个

DispatchQueue.main.async{
                        do {
                            let realm = try Realm()
           
                            var index = 0
                            items.forEach { item in
                                item.i = index
                                index = index + 1
                            }
                            try realm.write({
                                realm.add(groups, update: .modified)
                                realm.add(items, update: .modified)
                               }
                            })
                        } catch {
                            print("Realm error: \(error)")
                        }
                    }

【讨论】:

    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多