OStack程序员社区-中国程序员成长平台

标题: ios - 如何将 Parse 的 PFObject 改造为现有的、复杂的、聚合模型类? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 09:49
标题: ios - 如何将 Parse 的 PFObject 改造为现有的、复杂的、聚合模型类?

我有一个现有的模型类,我想用 Parse 来管理它,最好将它的父类(super class)从 NSObject 更改为 PFObject。但这是一个真实世界的模型类,在设计时没有考虑 Parse,因此它提出了许多挑战。

挑战

挑战是:

  1. 这个类是用 Swift 编写的。
  2. 此类具有存储属性和计算属性。 (当然,Parse 应该只管理存储的属性。)
  3. 某些属性包含其他自定义模型类的实例数组
  4. 其中一些自定义类本身包含用户对象,应由 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..
}

关键问题

所以我在这里有几个关键问题:

  1. 是否应将所有对 User 的引用替换为 PointerUser PFUser 的子类?
  2. 是否需要将 Participant 替换为 NSDictionary 等普通的旧 Cocoa 类型?或者有没有办法只为 Parse 的内部序列化目的提供与 NSDictionary 的相互转换?
  3. 是否对 Optional 等 swift-only 类型有任何规定?或者这是另一种情况,其中有一个扩展点来提供与 Parse 可以处理的数据类型的相互转换?
  4. 如何对 Participants 数组进行建模?参与者中的用户对象?
  5. 考虑到 Tango 的所有这些明显的困难,我是否更明智地实现一种将实例转换为/从普通旧 plist 类型(字典、数组、字符串、数字)转换的方法,并拥有PFObject 处理那些?

我对最大查询灵 active 或最大性能不感兴趣。我对可以可靠工作的最快的东西感兴趣,并且需要对现有代码进行最少的重写,这取决于现有的类层次结构。我知道 User/Tango 关系可以描述为多对多,这就是 PFRelation 的用途,但我觉得它需要专业重新设计以使用它。

换句话说,我真的希望我可以避免用一个新的类层次结构替换我的整个模型层,该类层次结构设计为非规范化的表,以满足 Parse 的乐趣。我有适用于当前结构的现有代码,我正在尝试在不破坏任何内容的情况下适应 Parse。

那么这些关键问题是否适合为 Parse 改进这个类?处理它们的正确方法是什么?



Best Answer-推荐答案


您绝对应该查看子类化指南。一些对您的用例特别重要的注意事项:

  1. 如果您将一个内置类子类化(例如 User : PFUser),那么您只需要注册该子类。所有的构造方法都返回 instancetype 所以你可以在 User 上调用它们,你会得到一个实际的 User 。同样,对 Parse 用户类的任何查询都将返回反序列化为您的类型的结果。
  2. 如果您为自己的类型子类化 PFObject,则还必须实现 +parseClassName。这会将您的类映射到您希望在数据浏览器中看到的名称。此名称必须在所有语言中保持一致,以确保您使用的是相同的数据。
  3. PFObject 子类库被编写为仅实现 @dynamic 属性。如果您 @static 它或定义方法,则 PFObject 将不理会它。如果您有一个同名的 ivar,则该属性不会保存到 Parse,但我们将创建一个访问器/突变器对,该对尊重我们在合并时采用的 PFObject 的内部锁服务器数据或准备保存操作。
  4. PFObject 可以处理任何 JSON 可序列化原语的属性、指向其他 PFObject 子类型的指针、其数组/字典以及 PFRelation 指针。我还没有玩过 Swift,所以我不知道它会如何与可选属性交互;我假设它们是隐藏的 NSNumber,PFObject 处理 NSNumber 以及原语(自动装箱/拆箱)。
  5. [Bonus] 要使您的子类自包含,您可以将以下内容添加到它们的定义中: //注意:+initialize 是 Objective-C 唯一的非多态函数;每节课 //必须直接实现。 +(无效)初始化{ [自注册子类]; }

关于ios - 如何将 Parse 的 PFObject 改造为现有的、复杂的、聚合模型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26857427/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4