AKRealmUtils
示例
为了运行示例项目,克隆仓库,然后从 Example 目录首先运行 pod install
。
需求
安装
AKRealmUtils 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中
pod 'AKRealmUtils'
用法
Realm Utils
Realm.shared
extension Realm {
public static var shared: Realm
}
Realm.shared
返回 realm 实例,如同使用 Realm()
实例化,但处理初始化错误。如果发生任何错误,程序将退出。
Realm.shared.finishWrite()
extension Realm {
public func finishWrite()
}
与 realm.commitWrite()
相同,但具有自动错误处理。
Realm.shared.safeWrite()
extension Realm {
public func safeWrite(_ block: (() -> Void))
}
类似于 realm.write {}
,但在写入事务中也可以调用。
Realm.Object.addToRealm()
extension Object {
public func addToRealm(update: Bool = true)
}
等同于调用 Realm.shared.add(object, update)
。默认更新为 true,如果对象没有主键则会导致错误。
Realm.Object.deleteFromRealm()
extension Object {
public func deleteFromRealm()
}
等同于调用 Realm.shared.delete(object)
。
Realm.Object.parse
extension Object {
public class func parseObject<T: ValueType>(_ rawObject: Any?) -> T?
public class func parseObject<T: ValueType>(_ rawObject: Any?) throws -> T
public class func parseObjects<T: ValueType>(_ rawObjects: Any?) -> [T]
}
这些方法中的每一个都打开一个写入事务,解析对象为领域对象,关闭写入事务,并处理错误。在解析服务器响应时非常有用。还绕过了Marshal的限制,它不允许解析顶级对象或数组。
领域清理
在某些方法中,在解析后必须删除某些Realm对象。使用Disposable
协议标记需要清理的对象
public protocol Disposable {
func disposable() -> Bool
/// Is guaranteed to be called in a write transaction
func willDispose()
}
willDispose()
是可选的。
然后应使用以下方法将可丢弃的属性添加到Realm
extension Realm {
public class func addDisposableType<T: Object>(_ type: T.Type) where T: Disposable
}
清理可以自动完成(当调用任何一个Object.parse
方法时)或手动完成
extension Realm {
public static var autoCleanUp = true
public func cleanUp()
}
序列化帮助工具
将字典转换为数组。
这可以通过以下方式调用:
extension MarshaledObject {
public func dictionaryTransformedValues<T: ValueType>(for key: KeyType) throws -> [T]
public func transformDictionaryValues<T: ValueType>() throws -> [T]
}
extension Dictionary {
public func dictionaryTransformedValues<T: ValueType>(for key: KeyType) throws -> [T]
public func transformDictionaryValues<T: ValueType>() throws -> [T]
}
如果字典位于另一个字典下的特定键中,请调用for key
方法。没有参数的方法会对对象本身执行转换。
例如,我们有一个以下字典
{
"id1": 1,
"id2": 3,
"id0": "asd"
}
对此进行转换将得到以下数组
[
{
"_Marshal_DictionaryKey": "id1",
"_Marshal_DictionaryValue": 1
},
{
"_Marshal_DictionaryKey": "id2",
"_Marshal_DictionaryValue": 3
},
{
"_Marshal_DictionaryKey": "id0",
"_Marshal_DictionaryValue": asd
},
]
访问字典条目可以通过两种方式完成
extension MarshaledObject {
public func valueForDictionaryKey<T: ValueType>() throws -> T
public func valueForDictionaryValue<T: ValueType>() throws -> T
public func valueForDictionaryKey<T: ValueType>() throws -> [T]
public func valueForDictionaryValue<T: ValueType>() throws -> [T]
}
或者通过直接根据键获取值。键是在
extension JSONParser {
public static var dictionaryKey: String {
return "_Marshal_DictionaryKey"
}
public static var dictionaryValue: String {
return "_Marshal_DictionaryValue"
}
}
将字典的数组字典转换为数组
在我们的这种结构中很有用
{
"id1":
[
{
"key1": "value1",
"key2": "value2"
},
{
"key3": "value3",
"key4": "value4"
},
],
"id2":
[
{
"key5": "value5",
"key6": "value6"
},
{
"key7": "value7",
"key8": "value8"
},
]
}
并希望接收
[
{
"key1": "value1",
"key2": "value2",
"_Marshal_DictionaryKey": "id1"
},
{
"key3": "value3",
"key4": "value4",
"_Marshal_DictionaryKey": "id1"
},
{
"key5": "value5",
"key6": "value6",
"_Marshal_DictionaryKey": "id2"
},
{
"key7": "value7",
"key8": "value8",
"_Marshal_DictionaryKey": "id2"
},
]
方法
extension MarshaledObject {
public func combinedDictionaryOfDictionariesOfArrays<T: ValueType>(for key: KeyType) throws -> [T]
public func combinedDictionaryOfDictionariesOfArrays<T: ValueType>() throws -> [T]
}
将字典的字典转换为数组
例如,我们有以下结构
{
"id1":
{
"key1": "value1",
"key2": "value2"
},
"id2":
{
"key3": "value3",
"key4": "value4"
},
}
并希望接收
[
{
"key1": "value1",
"key2": "value2",
"_Marshal_DictionaryKey": "id1"
},
{
"key3": "value3",
"key4": "value4",
"_Marshal_DictionaryKey": "id2"
}
]
方法
extension MarshaledObject {
public func combinedDictionaryOfDictionaries<T: ValueType>() throws -> [T]
public func combinedDictionaryOfDictionaries<T: ValueType>(for key: KeyType) throws -> [T]
}
ID 映射
如果收到对象 ID(或多个 ID),但我们想存储与该对象的关系,我们可以使用
extension MarshaledObject {
public func idMap<T: Object>(forKey key: KeyType) throws -> [T]
public func idMap<T: Object>(forKey key: KeyType) throws -> T?
}
它将自动获取存储在 key
下的 ID(s),从 Realm 读取该对象(s)并返回它。
作者
Artem-Kalmykov, [email protected]
许可证
AKRealmUtils 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。