Ios 将NSObject向上转换为RLMObject

Ios 将NSObject向上转换为RLMObject,ios,objective-c,realm,Ios,Objective C,Realm,如何将NSObject向上转换为RLMObject 假设您有一个类型为NSObject的模型对象,并假设您希望动态地将其向上投射到RLMObject,您将如何做 值得一提的是,RLMObject的属性不能在运行时填充,否则我可能会通过完成。(我的意思是……从技术上讲,他们可以……这太像黑客了) 我想做什么: 这背后的主要目的是创建一个缓存框架,该框架将在可交换的缓存依赖项(如领域、SQLite、核心数据等)之间动态选择。例如,我想象有一个预处理器标志,希望能够从使用领域切换到SQLite,而不必

如何将
NSObject
向上转换为
RLMObject

假设您有一个类型为
NSObject
的模型对象,并假设您希望动态地将其向上投射到
RLMObject
,您将如何做

值得一提的是,
RLMObject
的属性不能在运行时填充,否则我可能会通过
完成。(我的意思是……从技术上讲,他们可以……这太像黑客了)

我想做什么:

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

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

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

1) 在运行时遍历
NSObject
的属性,并为它们创建一个key/value对象

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

3) 利用领域的
initWithValue:
来填充属性


您的看法是什么?

看起来您提到的这个方法-
RLMObject.initWithValue
或一个静态等价物必须在RLMObject子类上调用,否则它会抛出一个异常:“对象类型'RLMObject'不受领域管理”

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

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

如果不继承RLMObject(比如知道对象何时变脏),可能会丢失一些领域特性,但仍然可能获得一些成功

我想你在核心数据方面也会遇到同样的问题。通常,核心数据只支持
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。我刚刚签出了它。它引发了一个异常:
对象类型“RLMObject”不是由领域管理的
。我基本上只是在创建一个模型,它是NSObject的一个子类,具有2个读写属性,然后我将其传递到“createInDefaultRealmWithValue:”。这是个例外,我明白你的意思。看起来您必须通过子类调用此方法,而不是通过RLMObject。。。那我的想法就错了。我认为最好将这个问题转发给领域支持,因为您可能需要比RLMObject更深一层来自己动态创建模式对象。另一种方法是手动将对象编码到某个字典或NSData,并将其附加到固定的RLMObject子类。