将NSObject向上转换为RLMObject

时间:2018-05-26 01:56:14

标签: ios objective-c realm

您如何将NSObject转发为RLMObject

假设你有一个NSObject类型的模型对象,并且说你想将它动态地转发为RLMObject,你会怎么做?

值得一提的是,RLMObject的属性无法在运行时填充,否则我可能会通过<objc/runtime.h>完成此操作。 (我的意思是......他们在技术上可以......它只是太过分了)

我想做的事情:

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

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

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

1)在运行时循环浏览NSObject的属性&amp;创建它们的键/值对象

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

3)利用Realm&#39; initWithValue:来填充属性

您的意见是什么?

1 个答案:

答案 0 :(得分:0)

看起来你提到的这个方法 - RLMObject.initWithValue或静态等价的createInDefaultRealmWithValue必须在RLMObject子类上调用,否则会抛出异常:&#34;对象类型&# 39; RLMObject&#39;不是由Realm&#34 ;.

管理的

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

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

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

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

当然,您可以将对象视为属性名称和值的字典,并将它们放入巨型(&#34;类型&#34;,&#34; id&#34;,&#34;属性&# 34;,&#34;值&#34;)表,但它不是最好的方法(可能很慢)。

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

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