ios - 如何将 Parse 的 PFObject 改造为现有的、复杂的、聚合模型类?
<p><p>我有一个现有的模型类,我想用 Parse 来管理它,最好将它的父类(super class)从 NSObject 更改为 PFObject。但这是一个真实世界的模型类,在设计时没有考虑 Parse,因此它提出了许多挑战。</p>
<h2>挑战</h2>
<p>挑战是:</p>
<ol>
<li>这个类是用 Swift 编写的。</li>
<li>此类具有存储属性和计算属性。 (当然,Parse 应该只管理存储的属性。)</li>
<li>某些属性包含其他自定义模型类的实例数组</li>
<li>其中一些自定义类本身包含用户对象,应由 Parse 管理。</li>
</ol>
<p>这些事情中的每一件事似乎都需要特殊处理才能在 Parse 中正确处理,Parse 的文档对这些问题进行了简要说明。</p>
<h1>现有模型类层次结构</h1>
<p>举个例子,我的课是这样的:</p>
<pre><code>// I’d like to change this to be a PFUser subclass.
class User : NSObject { /* an ordinary user object*/ }
// And this to be a PFObject subclass
class Tango : NSObject {
var user:User// Presumably, a Parse "Pointer" to a PFUser
var opponent:Participant
var info:NSString?
var watchers:NSArray // an array of Participants
var duration:NSTimeInterval? // (notice this is an optional value type, in accessible from Objc)
// various methods
}
// a custom class which contains a User
class Participant : NSObject
{
var status:String
var user:User // a Pointer to a PFUser?
// etc..
}
</code></pre>
<h2>关键问题</h2>
<p>所以我在这里有几个关键问题:</p>
<ol>
<li>是否应将所有对 User 的引用替换为 <code>Pointer</code> 到 <code>User</code> <code>PFUser</code> 的子类?</li>
<li>是否需要将 Participant 替换为 NSDictionary 等普通的旧 Cocoa 类型?或者有没有办法只为 Parse 的内部序列化目的提供与 NSDictionary 的相互转换?</li>
<li>是否对 <code>Optional<NSTimeInterval></code> 等 swift-only 类型有任何规定?或者这是另一种情况,其中有一个扩展点来提供与 Parse 可以处理的数据类型的相互转换?</li>
<li>如何对 Participants 数组进行建模?参与者中的用户对象?</li>
<li>考虑到 <code>Tango</code> 的所有这些明显的困难,我是否更明智地实现一种将实例转换为/从普通旧 plist 类型(字典、数组、字符串、数字)转换的方法,并拥有PFObject 处理那些?</li>
</ol>
<p>我对最大查询灵 active 或最大性能不感兴趣。我对可以可靠工作的最快的东西感兴趣,并且需要对现有代码进行最少的重写,这取决于现有的类层次结构。我知道 <code>User/Tango</code> 关系可以描述为多对多,这就是 <code>PFRelation</code> 的用途,但我觉得它需要专业重新设计以使用它。</p>
<p>换句话说,我真的希望我可以避免用一个新的类层次结构替换我的整个模型层,该类层次结构设计为非规范化的表,以满足 Parse 的乐趣。我有适用于当前结构的现有代码,我正在尝试在不破坏任何内容的情况下适应 Parse。</p>
<p>那么这些关键问题是否适合为 Parse 改进这个类?处理它们的正确方法是什么?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>您绝对应该查看子类化指南。一些对您的用例特别重要的注意事项:</p>
<ol>
<li>如果您将一个内置类子类化(例如 <code>User : PFUser</code>),那么您只需要注册该子类。所有的构造方法都返回 <code>instancetype</code> 所以你可以在 User 上调用它们,你会得到一个实际的 User 。同样,对 Parse 用户类的任何查询都将返回反序列化为您的类型的结果。</li>
<li>如果您为自己的类型子类化 <code>PFObject</code>,则还必须实现 <code>+parseClassName</code>。这会将您的类映射到您希望在数据浏览器中看到的名称。此名称必须在所有语言中保持一致,以确保您使用的是相同的数据。</li>
<li><code>PFObject</code> 子类库被编写为仅实现 <code>@dynamic</code> 属性。如果您 <code>@static</code> 它或定义方法,则 PFObject 将不理会它。如果您有一个同名的 ivar,则该属性不会保存到 Parse,但我们将创建一个访问器/突变器对,该对尊重我们在合并时采用的 <code>PFObject</code> 的内部锁服务器数据或准备保存操作。</li>
<li><code>PFObject</code> 可以处理任何 JSON 可序列化原语的属性、指向其他 <code>PFObject</code> 子类型的指针、其数组/字典以及 <code>PFRelation</code> 指针。我还没有玩过 Swift,所以我不知道它会如何与可选属性交互;我假设它们是隐藏的 NSNumber,<code>PFObject</code> 处理 NSNumber 以及原语(自动装箱/拆箱)。</li>
<li> 要使您的子类自包含,您可以将以下内容添加到它们的定义中:
<code>
//注意:+initialize 是 Objective-C 唯一的非多态函数;每节课
//必须直接实现。
+(无效)初始化{
[自注册子类];
}
</code></li>
</ol></p>
<p style="font-size: 20px;">关于ios - 如何将 Parse 的 PFObject 改造为现有的、复杂的、聚合模型类?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/26857427/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/26857427/
</a>
</p>
页:
[1]