【问题标题】:Upcasting NSObject to RLMObject将 NSObject 向上转换为 RLMObject
【发布时间】:2018-05-26 01:56:13
【问题描述】:

您如何将NSObject 向上转换为RLMObject?

假设您有一个 NSObject 类型的模型对象,并说您想将其动态向上转换为 RLMObject,您会怎么做?

值得一提的是RLMObject的属性不能在运行时填充,否则我可能会通过<objc/runtime.h>来完成。 (我的意思是......从技术上讲,他们可以......这太过分了)

我想做的事:

这背后的主要目的是创建一个缓存框架,该框架将在可互换的缓存依赖项(如 Realm、SQLite、Core Data 等)之间动态选择。例如,我想象有一个预处理器标志,希望能够从使用 Realm 切换到 SQLite ,而不必更改我的模型子类。

这将要求我的所有模型都是 NSObject 的子类,因为 RLMObject 在 SQLite 环境中没有意义。

我一直在思考这个问题,这是我的方法:

1) 在运行时循环遍历NSObject 的属性并创建它们的键/值对象

2) 在运行时创建RLMObject 的子类,并从传递的NSObject 模型中复制属性列表

3) 利用 Realm 的 initWithValue: 填充属性

你有什么看法?

【问题讨论】:

    标签: ios objective-c realm


    【解决方案1】:

    看起来您提到的这种方法 - RLMObject.initWithValue 或静态等效 createInDefaultRealmWithValue 必须在 RLMObject 子类上调用,否则它会引发异常:“对象类型 'RLMObject' 不受领域管理”。

    您需要一个动态模式创建 API(RLMObject 的基础),我认为它不是公共 API。

    另一种方法是将对象手动编码到某个字典或 NSData 并将其附加到固定的 RLMObject 子类。

    你可能会因为不继承 RLMObject 而失去一些 Realm 特性,比如知道对象何时变脏,但仍然可能会取得一些成功。

    我认为 Core Data 也会遇到同样的问题。通常Core Data 只支持NSManagedObject 子类,而且它需要你预先在模型文件中定义一个固定的模式(在代码中由NSManagedObjectModel 表示)。

    当然,您可以将对象视为属性名称和值的字典,并将它们放入一个巨大的 ("type","id","property","value") 表中,但这不是最好的接近(可能很慢)。

    使用 SQLite 后端可以实现相同的策略。看看您会为此选择哪种架构很有趣。

    我建议将键值存储作为后端,并避免使用 SQL。或者将 SQL 视为键值存储,如 ("type+id", "encoded_object_data") :)

    【讨论】:

    • 在我看来,无论你如何扭曲它,仍然需要在运行时向上转换或动态创建RLMObject 的子类。这样做的主要原因是,如果您在类类型 RLMObject(不是子类)上调用 initWithValue:,由于对象具有 0 个属性,它将始终返回一个空模式。如果您对此或任何其他想法有任何想法,请告诉我:)
    • 我相信架构不会为空,它将通过 KVC 从您的对象中填充。明确地说,我的意思是这样的代码:RLMObject *cacheObject = [RLMObject createInDefaultRealmWithValue:plainObject];,其中plainObject 不是任何特殊的子类,但它符合 KVC。
    • 我刚刚检查过了。它抛出一个异常:Object type 'RLMObject' is not managed by the Realm.
    • 我基本上只是在创建模型,它是 NSObject 的子类,具有 2 个读写属性,然后我将其传递给“createInDefaultRealmWithValue:”。这会引发异常。
    • 我明白你的意思。看起来你必须通过子类调用这个方法,而不是通过 RLMObject ......那么我的想法是错误的。我认为最好将此问题转发给 Realm 支持,因为您可能需要比 RLMObject 更深一层才能自己创建动态模式对象。另一种方法是将对象手动编码到某个字典或 NSData 并将其附加到固定的 RLMObject 子类。
    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多