1

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

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

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

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

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

4

1 回答 1

0

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

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

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

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

于 2015-01-21T14:15:57.987 回答