RealmWrapper 1.4.3

RealmWrapper 1.4.3

DongHee Kang维护。



  • DongHee Kang

RealmWrapper

Cocoapods Carthage compatible Swift GitHub license Build Status

RealmWrapper 是 realm-cocoa (https://github.com/realm/realm-cocoa) 中 RealmSwift (https://github.com/realm/realm-cocoa/tree/master/RealmSwift) 的封装库。

如果您使用 RealmWrapper,可以通过 Notification 和 Transaction 处理轻松使用 UI 更新。同时,您无需担心在 Notification 块中使用 self 时产生保留循环。

概览

如果您使用 RealmSwift,在每笔交易中都必须小心处理 try 语句和线程处理。然而,在 RealmManageable 中,它只管理一个 realm 文件,transaction 处理是使用 Realm-only DispatchQueue 进行的。拥有 RealmManageableRealmProxiable 可以轻松地添加、修改或删除模型,而无需担心 try 语句和线程处理。

用户模型

@objcMembers
class User: Object {
    dynamic var id: String?
    dynamic var name: String?

    override static func primaryKey() -> String? {
        return "id"
    }
}

var user = User()
user.id = UUID().uuidString
user.name = "Kevin"

使用 RealmSwift

let realm = try! Realm(configuration: Realm.Configuration(fileURL: URL(fileURLWithPath: RLMRealmPathForFile("user.realm")), schemaVersion: 1, objectTypes: [User.self]))
try! realm.write {
    realm.add(user)
}

使用 RealmWrapper

UserRealmManager().transaction(writeHandler: { (realm) in
    realm.add(user)
})
UserRealmProxy().append(user)

线程

  • 默认情况下,您可以使用事务函数在 MainThread 中处理 Realm 交易。
UserRealmManager().transaction(writeHandler: { (realm) in
    realm.add(user)
})
  • 您可以使用 DispatchQueue 的 isSync 参数通过后台线程实现它。
UserRealmManager().transaction(isSync: false, writeHandler: { (realm) in
    realm.add(user)
})
UserRealmManager().transaction(writeQueue: DispatchQueue(label: "background"), isSync: false, writeHandler: { (realm) in
    realm.add(user)
})
  • 您可以添加完成闭包。
UserRealmManager().transaction(isSync: false, writeHandler: { (realm) in
    realm.add(user)
}) { (realm, error) in
    self.tableView.reloadData()
}

开始使用

  1. 创建一个用于管理一个领域文件(realm file)的 RealmManager
final class UserRealmManager: RealmManageable {

    var isUseInMemory: Bool {
        return false
    }
    var schemaVersion: UInt64 {
        return 1
    }
    var fileName: String {
        return "user"
    }
    var objectTypes: [Object.Type]? {
        return [User.self]
    }

}
  1. 创建一个 RealmProxy 负责为 Controller 提供 CRUD(创建、读取、更新、删除)功能。
struct UserRealmProxy<RealmManager: UserRealmManager>: RealmProxiable {

    var users: RealmQuery<User> {
        return query(sortProperty: "date", ordering: .ascending)
    }

    func append(_ user: User) {
        rm.transaction(writeHandler: { (realm) in
            realm.add(user, update: .all)
        })
    }

    func delete(_ user: User) {
        rm.transaction(writeHandler: { (realm) in
            realm.delete(user)
        })
    }

    func updateName(id: String, name: String, age: Int) {
        guard let user = userFromId(id) else {return}

        rm.transaction(writeHandler: { (realm) in
            user.name = name
            user.age = age
            realm.add(user, update: .all)
        })
    }

    func userFromId(_ id: String) -> User? {
        return query(filter: "id == '\(id)'").results.first
    }

}

var user = User()
user.id = UUID().uuidString
user.name = "Kevin"

UserRealmProxy().append(user)
UserRealmProxy().delete(user)
UserRealmProxy().updateName(id: user.id, name: "Kris")
  1. 如果你想在 Controller 中注册 Realm 对象状态的监听器,你可以在 RealmQuery 中注册。
let users: RealmQuery<User> = UserRealmProxy().users

users.setSection(0)
    .addInsertNotificationBlock(self) { (self, insertions) in
        self.tableView.reloadData()
    }
    .addModificateNotificationBlock(self) { (self, modifications) in
        self.tableView.reloadRows(at: modifications, with: .fade)
    }
    .addDeleteNotificationBlock(self) { (self, deletions) in
        self.tableView.deleteRows(at: deletions, with: .fade)
    }
    .registerNotification()

由于 RealmQuery 采用弱引用处理以防止内存泄漏,因此如果你只传递 self,则无需担心引用循环,可以使用闭包而不必担心引用循环。

public func addDeleteNotificationBlock<Object: AnyObject>(_ object: Object, block: @escaping (Object, [IndexPath]) -> Void) -> Self {
    deleteNotificationBlock = { [weak object] (deletions) in
        guard let weakObject = object else {return}

        block(weakObject, deletions)
    }
    
    return self
}

使用示例

RealmManageable 属性

属性 类型 默认值 描述
isUseInMemory Bool required 使用内存中的 Realm
fileName Bool required Realm 文件名
appGroupIdentifier String? nil 用于 App 扩展的 Realm 文件夹的值

示例

  1. 执行 carthage update
$ carthage update --platform iOS
  1. 打开 RealmWrapper.xcodeproj
$ open RealmWrapper.xcodeproj
  1. 运行 RealmWrapperExample

安装

CocoaPods (iOS 9+)

platform :ios, '9.0'
use_frameworks!

target '<Your Target Name>' do
    pod 'RealmWrapper'
end

Carthage (iOS 9+)

github "k-lpmg/RealmWrapper"

LICENSE

这些作品在MIT许可证下可用。更多信息请参阅LICENSE文件。