RealmWrapper
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 进行的。拥有 RealmManageable 的 RealmProxiable 可以轻松地添加、修改或删除模型,而无需担心 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()
}
开始使用
- 创建一个用于管理一个领域文件(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]
}
}
- 创建一个
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")
- 如果你想在 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 文件夹的值 |
示例
- 执行 carthage update
$ carthage update --platform iOS
- 打开 RealmWrapper.xcodeproj
$ open RealmWrapper.xcodeproj
- 运行 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文件。