Как лучше всего взаимодействовать с объектом в target-c? - PullRequest
0 голосов
/ 08 февраля 2012

У меня следующие вопросы:

Например, у меня есть объект A (это объект модели данных).Предположим, что объект A имеет некоторое свойство (например, request property).Также у меня есть объект B (это мой объект просмотра).

Итак, моя проблема в следующем: когда моя модель данных будет изменена (значение свойства request изменилось), я хочу знатьОб этих событиях на мой взгляд (объект B)

Как создать это взаимодействие между объектом.

Например в запросе записано значение "some_value" и после этого объект B сразу узнает об этом.

Спасибо за ответ!

Ответы [ 4 ]

2 голосов
/ 08 февраля 2012

Вы можете использовать шаблон делегирования, NSNotifications, блоки обратного вызова и даже KVO.Выбор зависит от ситуации, в вашем случае будет работать делегат или блок обратного вызова.

1 голос
/ 08 февраля 2012

Я бы использовал Наблюдение значения ключа .Ваш контроллер представления (а не само представление) настроит себя в качестве наблюдателя для объекта модели данных, и когда он получит уведомления наблюдателя, он обновит представление.

[myDataObject addObserver: myViewController 
               forKeyPath: @"request"  
                  options: NSKeyValueObservingOptionNew
                  context: nil];

// in the view controller you need

-(void) observeValueForKeyPath: (NSString*) path
                      ofObject: (id) aDataObject
                        change: (NSDictionary*) changeDictionary
                       context: (void*) context]
{
    if (aDataObject == myDataObject
        && [path isEqualToString: @"request"])
    {
        // change you are interested in
    }
    // Call suoer implementation of this method if it implements it
}

Не забудьте удалитьНаблюдатель, когда вы закончите с этим.

Также будьте осторожны в многопоточной среде.Наблюдения уведомляются в том же потоке, в котором происходит изменение.Если это не основной поток, вам нужно будет использовать -performSelectorOnMainThread:withObject:waitUntilDone: для внесения любых изменений в пользовательский интерфейс.

1 голос
/ 08 февраля 2012

Если вы просто хотите, чтобы объект B знал, что происходит, я бы предложил использовать делегирование. Если, возможно, позже вы захотите, чтобы объекты C, D и E тоже знали, что произошло в объекте A, я бы предложил использовать NSNotification.

0 голосов
/ 10 февраля 2012

Например, у меня есть класс DataModel. На этом этапе я добавляю наблюдателя для моей собственности str . Для объекта я пришлю свой контроллер вида.

.h

#import <Foundation/Foundation.h>

@interface DataModel : NSObject

@property (strong, nonatomic) NSString *str;

- (void)setUpObserver:(id)object;

@end

.m

#import "DataModel.h"

@implementation DataModel

@synthesize str;

- (void)setUpObserver:(id)object
{ 
    [self addObserver:object forKeyPath: @"str" options: NSKeyValueObservingOptionNew context: nil];
}

@end

На мой взгляд контроллер

#import "DataModel.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    dm = [[DataModel alloc] init];
    [dm setUpObserver:self];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

    if (object == dm && [keyPath isEqualToString: @"str"])
    {
        NSLog(@"it's work");
    }


}

- (IBAction)changeValue:(id)sender {
    dm.str = @"test change value";
}

@end

Это моя реализация КВО. Спасибо JeremyP за объяснение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...