【问题标题】:Initialization methods for PFObject Subclass Objects that are Generated by ParseParse 生成的 PFObject 子类对象的初始化方法
【发布时间】:2015-03-19 10:56:24
【问题描述】:

这是用iOS 标记的,但我相信它对其他 Parse SDK 也很有用。您可能知道,Parse 不久前向iOS SDK 添加了创建本机PFObject 子类的功能。出于多种原因,这是一个很好的补充。首先,它允许编译器通过为对象属性创建动态属性来检查您的代码:

myObject[@"myAttribute"] 转换为myObject.myAttribute

其次,对这个问题更重要的是,自定义子类可以增加功能。例如,假设我创建了一个警报应用程序,它将 Alarm 对象存储在 Parse 云上。在我的自定义子类中,我可以覆盖+ (instancetype)object- (void)saveEventually- (void)deleteEventually 方法,以便alarm 对象可以在创建、修改或删除时为自己安排/更新/删除UILocalNotification

这就是事情变得复杂的地方,我的实际问题出现了。假设用户在一台设备上创建了一个警报(将其上传到云端),然后将其自动同步到另一台设备。第二个设备显然在后台使用PFQuery- (BFTask *)findObjectsInBackground 更新其内容,然后在每个对象上调用- (BFTask *)fetchIfNecessaryInBackground 以确保其所有内容都在设备上。我的问题是:当从 Parse 云数据库中找到/获取 PFObject 子类时,会调用什么方法(如果有)?那么,从本地数据存储区初始化的对象呢?

就像我提到的,重写各种方法非常适合在设备上创建和管理的对象,但我很困惑如何从刚刚从本地或远程到达内存的新对象中运行自定义代码数据存储。任何有关如何处理此问题的想法或建议将不胜感激。 Parse 文档没有涵盖这种情况,因此它甚至可能不是最佳实践,但在我看来它应该是。无论如何,感谢您的宝贵时间和见解。

【问题讨论】:

    标签: ios objective-c parse-platform subclass pfobject


    【解决方案1】:

    对于NSObject 的大多数子类,可能的方法是重写-init 方法。

    但是,正如您在上一段中提到的那样,这种做法没有记录在案,您应该避免这种做法。 PFObjects 的工作方式使得在内存中拥有同一对象的多个实例成为可能(多个 PFObjects 具有相同的 objectId)。而且您无法控制创建这些对象的时间或原因,因此依赖初始化时执行的代码可能是个坏主意。如果您一直在使用 Core Data,请注意 Parse 确实以不同的方式处理事情,因此最佳实践是不同的。

    例如,我并不是说是这种情况,但是如果在保存之前创建每个对象的副本会怎样?如果在使用“缓存然后网络”策略进行查询时创建了两次对象怎么办?即使你让它工作,你仍然会得到一些可能会随着框架的每次更新而中断的东西。

    我认为您应该将初始化代码捆绑在您自己的方法中,当您从查询或本地数据存储中接收到对象时,您会在对象上调用自己。覆盖在面向对象编程中是一种很好的设计和实践,但也有一些例外,我认为这是其中之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      相关资源
      最近更新 更多