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