【问题标题】:Accessing realm and filter results in different threads访问领域和过滤器会导致不同的线程
【发布时间】:2019-10-22 07:13:20
【问题描述】:

大家好

我遇到了一个大问题。我正在尝试在主线程中访问领域数据,但由于我需要对数据进行大量同步操作,例如更新、插入等,我决定搜索是否有可能异步执行所有这些操作但是对于我尝试实施的每种方法,我都会遇到不同的错误。

我正在按如下方式创建领域数据库:

realm = try Realm(configuration: Realm.Configuration(
                  fileURL: fileURL,
                  encryptionKey: nil,
                  schemaVersion: schemaVersion,
                  objectTypes: objectTypes))

访问数据如下:

guard let realm = realm else {
  return nil
}
let results = realm.objects(SPUserModel.self)
return Array(results)

在主线程中执行所有这些 upsert 操作会将我的内存提高到 1GB,这很糟糕。使它们异步可能是一种解决方案,但存在不同的线程,这是一个问题。

如果你能帮我解决这个问题会很高兴。

【问题讨论】:

  • 这里可能还有问题;以数组return Array(results) 的形式返回结果会断开这些对象与 Realm 的连接,并且它们将不再实时更新;它们在观察时不会更新,并且不会为它们触发事件; Array 与 Results 对象不同。此外,正如您所发现的,Realm 结果是延迟加载的,并且在需要它们之前不会占用内存 - 但是,将它们转换为数组会占用每个对象的内存。

标签: ios swift multithreading realm


【解决方案1】:
extension Realm {
class func realmInstance() -> Realm? {
   let realm = try Realm(configuration: Realm.Configuration(
                  fileURL: fileURL,
                  encryptionKey: nil,
                  schemaVersion: schemaVersion,
                  objectTypes: objectTypes))
   return realm
}

访问:

DispatchQueue(label: "background").async {
    Realm.realmInstance()?.objects(SPUserModel.self)
}

【讨论】:

  • 你能澄清一下这是做什么的吗?尤其是Realm.realmInstance()?.objects(SPUserModel.self) 这一行?
  • 我认为从数据库中返回所有该类型的对象
  • @MihailStoica 嗯,它似乎没有这样做。如果要返回数据库中的所有对象,则需要将它们放在某个地方,例如结果变量,例如let myResultsObject = realm.objects(SPUserModel.self)它不会那样做。此外,每次调用 Realm.realmInstance 时,该扩展都会配置领域,并且不需要,因为一旦配置领域,它会保留该配置直到更改。它还在后台线程上重新配置领域,这又是不需要的。问题是 OP 将 Realm 结果转换为一个正在吞噬内存的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
相关资源
最近更新 更多