领域查询有时 return 无数据

Realm query sometimes return no data

我正在实施一个过程来存储数十万条记录并通过领域查询检索它们。

简化代码如下

final class Friend: Object {
    @objc dynamic var number: Int64 = 0
    @objc dynamic var name: String = ""

    convenience init(number: Int64, label: String) {
        self.init()
        self.number = number
        self.label = label
    }

    override class func primaryKey() -> String? {
        return "number"
    }
}

extension Realm {
    static var `default`: Realm {
        get {
            do {
                let realm = try Realm(configuration: RealmConstants.configuration)
                return realm
            } catch {
                return self.default
            }
        }
    }
}
struct RealmClient {
    static func save(_ list: [Friend],
                              completion: @escaping (Result<Void, Error>) -> Void) {

        DispatchQueue.global().async {
            autoreleasepool {
                do {
                    let realm = Realm.default
                    try realm.write {

                        realm.add(list)
                        completion(.success(()))
                    }
                } catch {
                    completion(.failure(error))
                }
            }
        }
    }
}
class DataStore {

  let realm = realm
  
  init(realm: Realm.default) {
     self.realm = realm
  }

  var recordcounts: Int {
     return realm.objects(Friend.self).count
  }
}

但是,有时realm查询returns0条记录。


RealmClient.save(friendList) -> friendList is hundreds of thousands of data fetched from server

let dataStore = DataStore()
dataStore.recordcounts -> sometimes return 0

所以我实现了刷新领域实例,但没有帮助。

像这样。 realm.refresh()

我希望能够始终在查询中获取数据。 如何使用查询实现稳定的数据?

Realm 写入是事务性的 - 事务是 Realm 将其视为单个不可分割操作的读取和写入操作列表。

写入后闭包{}内的读写是事务的一部分;在所有这些完成之前,数据不会被提交。交易也是全有或全无 - 所有操作都完成或 none.

对于这种情况最重要的是,事务是同步的,因此在事务中添加回调将呈现间歇性结果。

将回调移到写入事务之外

try realm.write {
   realm.add(list)
}
completion(.success(()))

可以用我们以前写领域交易的方式来说明:

realm.beginWrite()
write some data

// Commit the write transaction to make this data available to other threads
try! realm.commitWrite() <- data is not valid until after it's been committed

//data has been committed