RealmExtensions

这个包为 Realm 提供了方便的扩展。

ChainWrite

chainWriteRealmwrite 函数的替代品。

public func chainWrite(_ f: () throws -> ()) {
    if self.isInWriteTransaction {
        try! f()
    } else {
        try! self.write {
            try! f()
        }
    }
}

它允许你在可能已经在写入事务中但你不知道的情况下,安全地调用写入事务。

RealmTransaction

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() -> RealmTransactiontransaction 提交之前调用 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 Realm

这个包在 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>