2015-05-18 1 views
0

Я вижу некоторое интересное поведение при попытке доступа и изменения одного и того же PFObject с двух разных контроллеров.Обновление PFObject с другого контроллера вида

У меня есть один контроллер вида, который имеет сильное свойство для PFObject. Когда я представляю второй контроллер представлений, он обладает слабым свойством одного и того же типа, поэтому я устанавливаю это свойство равным первому свойству контроллера. Когда я изменяю данные PFObject во втором контроллере представления, он обновляется в первом контроллере представления, потому что, по-моему, это тот же самый объект. Это работает очень хорошо.

Теперь, если я пытаюсь установить PFObject равным nil во втором контроллере, когда я возвращаюсь к первому контроллеру PFObject по-прежнему определяется - это не nil. Почему это? Мне нужно, чтобы второй контроллер просмотра редактировал тот же самый объект, которому владеет первый контроллер.

Было бы лучше сохранить свойство для самого первого контроллера во втором контроллере и вместо этого ссылаться на это публичное свойство вместо того, чтобы пытаться использовать два свойства для одного и того же объекта или что было бы рекомендовано в этом случае?

//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 

ответ

0

Во втором контроллере, вы устанавливаете его ссылку из PFObject в nil. Это не влияет на сам объект или на первый контроллер представления, поскольку он все еще имеет ссылку на объект.

Было бы лучше определить модель данных, доступную любому контроллеру вида, но не принадлежащую исключительно кому-либо. Затем эта модель данных могла отправлять уведомления, и если бы диспетчер представлений интересовался, он мог бы слушать и отвечать соответствующим образом.

В качестве простого примера подумайте о том, как Parse реализовал текущего пользователя. Вы просто ссылаетесь на [PFUser currentUser] из любой части вашего кода. Вы можете сделать что-то подобное с [MyAppData currentWidget] или, очевидно, какие данные должны быть доступны.

И, к примеру, установщик для currentWidget может разместить NSNotification, например WidgetHasChangedNotification. Контроллеры просмотра могут затем добавить себя в качестве наблюдателей к этому уведомлению.

+0

Мне нравится, как вы думаете, имеет смысл, спасибо. – Joey