AKRealmUtils 1.0.3

AKRealmUtils 1.0.3

Artem Kalmykov 维护。



 
依赖
Realm>= 0
RealmSwift>= 0
 

  • 作者
  • Artem-Kalmykov

AKRealmUtils

CI Status Version License Platform

示例

为了运行示例项目,克隆仓库,然后从 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 文件。