从不同的视图控制器更新 PFObject

Updating a PFObject from a different view controller

我在尝试从两个不同的视图控制器访问和修改相同的 PFObject 时看到了一些有趣的行为。

我有一个视图控制器,它对 PFObject 有很强的 属性。当我呈现第二个视图控制器时,它有一个相同类型的弱 属性,所以我将 属性 设置为等于第一个控制器的 属性。当我在第二个视图控制器中更改 PFObject 的数据时,它会在第一个视图控制器中更新,因为我认为它本质上是同一个对象。这真的很好用。

现在,如果我尝试在第二个控制器中将 PFObject 设置为等于 nil,当我返回到第一个控制器时,PFObject 仍然被定义 - 它不是 nil。这是为什么?我需要确保第二个视图控制器正在编辑第一个控制器拥有的完全相同的对象。

将 属性 存储到第二个控制器中的第一个控制器本身并引用 public 属性 而不是尝试将两个属性用于相同的属性会更好吗对象,或者在这种情况下会推荐什么?

//First controller
@property (nonatomic, strong) PFObject *myObject;

//prepare for segue
//ensure myObject is not nil first, otherwise alloc init, then
secondController.myObject = self.myObject;

//Second controller
@property (nonatomic, weak) PFObject *myObject;

//somewhere in the code
self.myObject[SomeKey] = SomeValue; //works great, updates myObject in both controllers
self.myObject = nil; //doesn't affect the first controller's myObject

在第二个控制器中,您将 PFObjectreference 设置为 nil。这不会影响对象本身或第一个视图控制器,因为它仍然有对该对象的引用。

最好定义一个数据模型,它可以被任何视图控制器访问,但不被任何视图控制器独占。然后该数据模型可以发送通知,如果视图控制器感兴趣,它可以监听并做出相应的响应。

举个简单的例子,想想Parse是如何实现当前用户的。您只需从代码的任何部分引用 [PFUser currentUser] 。您可以使用 [MyAppData currentWidget] 做类似的事情,或者显然需要访问任何数据。

为了进一步举例,currentWidget 的 setter 可以 post 和 NSNotification,例如 WidgetHasChangedNotification。然后视图控制器可以将自己添加为该通知的观察者。