这个包为 Realm 提供了方便的扩展。
chainWrite
是 Realm 的 write
函数的替代品。
public func chainWrite(_ f: () throws -> ()) {
if self.isInWriteTransaction {
try! f()
} else {
try! self.write {
try! f()
}
}
}
它允许你在可能已经在写入事务中但你不知道的情况下,安全地调用写入事务。
RealmTransaction 是一个结构体,包含一个属性 transaction: (Realm) -> ()
。 这个属性代表一个未来的 Realm 数据库写入操作。 RealmTransaction 允许你通过组合较小的事务来构建复杂的 Realm 数据库写入操作。
要创建一个 RealmTransaction,你可以简单地调用以下两个初始化器之一:
let saveTransaction = RealmTransaction { realm in
realm.write {
realm.add(object)
}
}
或
let deleteTransaction = RealmTranscation {
try! Realm().delete(anotherObject)
}
然后,要将事务提交到 Realm 数据库,你可以调用:
saveTransaction.write()
deleteTransaction.write()
通常,需要将多个/复杂的事务提交到数据库。 RealmTransaction 提供了一个自定义运算符来将多个事务链接在一起:
public func <-> (lhs: RealmTransaction, rhs: RealmTransaction) -> RealmTransaction {
RealmTransaction.init(transaction: lhs.transaction <> rhs.transaction)
}
示例
let transaction = saveTransaction <-> deleteTransaction
transaction.write()
RealmTransaction 附带了许多便捷运算符:
public static func add(_ object: Object) -> RealmTransaction
public static func add(_ object: Object?) -> RealmTransaction
public static func add(_ objects: [Object]) -> RealmTransaction
public static func delete(_ object: Object) -> RealmTransaction
public static func delete<S>(_ objects: S) -> RealmTransaction where S: Sequence, S.Element: Object
refresh() -> RealmTransaction
在 transaction
提交之前调用 realm.refresh
。
public func reduce() -> RealmTransaction
将 RealmTranscactions 的数组缩减为单个 RealmTransaction。
public func set<Value>(_ keyPath: ReferenceWritableKeyPath<Self, Value>, _ value: Value) -> RealmTransaction
允许你通过 keyPaths 设置对象的属性。
let transaction = object.set(\.name, "luke")
这个包在 composable architecture 之上提供了方便的扩展。
你可以轻松扩展一个 Reducer
来处理所有 Realm 数据库事务:
public enum RealmAction {
case commit(RealmTransaction)
case saveObject(Object)
case deleteObject(Object)
case deleteObjects([Object])
}
static func realmReducer(
action toGlobalAction: CasePath<Action, RealmAction>,
realm toRealm: @escaping (Environment) -> Realm
) -> Reducer<State, Action, Environment>