ios - Swift 使用 realm.add() 或 realm.create() 将大量数据写入 Realm

标签 ios swift realm

我需要向 Realm 写入大量数据(例如 200000 输入),我使用 realm.add() 在后台线程中写入数据。但它收到了崩溃消息:

Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread.'

let cities = try decoder.decode([City].self, from: dataFromStream)
let dispatchQueue = DispatchQueue(label: "com.example.myApp.bg", qos: .background)
dispatchQueue.async {
    let myBackgroundRealm = try! Realm()
    myBackgroundRealm.beginWrite()

    for city in cities {
        myBackgroundRealm.add(city, update: false)
    }

    try! myBackgroundRealm.commitWrite()
}

所以我改为使用 Realm.create(),它起作用了。但是我仍然不明白 Realm.create() 和 Realm.add() 在写入大数据时有什么区别。

let cities = try decoder.decode([City].self, from: data)
let dispatchQueue = DispatchQueue(label: "com.example.myApp.bg", qos: .background)
dispatchQueue.async {
    let myBackgroundRealm = try! Realm()

    for city in cities {
        try! myBackgroundRealm.write {
            myBackgroundRealm.create(City.self, value: city, update: false)
        }
    }
}

最佳答案

当对 Realm 进行异步写入时,您必须初始化线程安全引用并在后台线程中解析该引用。取自 Realm 的文档 https://realm.io/docs/swift/latest/#passing-instances-across-threads

let person = Person(name: "Jane")
try! realm.write {
    realm.add(person)
}
let personRef = ThreadSafeReference(to: person)
DispatchQueue(label: "background").async {
    autoreleasepool {
        let realm = try! Realm()
        guard let person = realm.resolve(personRef) else {
            return // person was deleted
        }
        try! realm.write {
            person.name = "Jane Doe"
        }
    }
}

关于ios - Swift 使用 realm.add() 或 realm.create() 将大量数据写入 Realm ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52377899/

相关文章:

ios - 如何识别应用程序进入后台的方式?

ios - Swift -如何显示每行包含多个字符串(不是组件)的 UIPickerView

ios - 警告 : could not load any Objective-C class information in Swift realm

ios - 来自服务器的数据库中的 Realm 更新结果

ios - iOS Swift 读取 Json 失败

ios - 将自定义 UIImage 设置为 UIImageRenderingModeAlwaysTemplate 的 UISlider

ios - 快速计算 map 的距离和预计到达时间

ios - 覆盖 prepareForSegue 不起作用

iOS 11 UITableView 中的额外顶部空间

realm - posix_fallocate() 失败 : Operation not permitted while opening . Realm 文件