Соблюдайте свойство собственности

Я пытаюсь наблюдать за свойством моего AppDelegate, чтобы обновить представление таблицы. Это немного сложно, поэтому вот часть моего кода.

Я хочу обновлять содержимое UITableView всякий раз, когда обновляется массив. Я чувствую, что есть более эффективный способ сделать это, но не могу понять. Я прочитал онлайн-документацию Apple и немного запутался. Заранее спасибо!! :)

//Game.h
@interface Game: NSObject
@property (strong,nonatomic) NSMutableArray *myArray;
@end

//AppDelegate.h
#import "Game.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong,nonatomic) Game *myGame;
@end

//ViewController.m
#import "AppDelegate.h"
@implementation ViewController
//...
- (void)viewDidLoad
{
    [(AppDelegate*)[[UIApplication sharedApplication] delegate] addObserver:self forKeyPath:@"myGame" options:0 context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    //THIS METHOD NEVER GETS CALLED
    NSLog(@"change observed");
    [self.tableView reloadData];
}
- (void)dealloc
{
    [(AppDelegate*)[[UIApplication sharedApplication] delegate] removeObserver:self forKeyPath:@"myGame"];
}
//...
@end

person felix_xiao    schedule 15.07.2013    source источник
comment
Попробуйте использовать ключевой путь myGame.myArray.   -  person rmaddy    schedule 15.07.2013
comment
Дубликат stackoverflow.com/questions/477204/?   -  person Martin R    schedule 15.07.2013


Ответы (1)


ОБНОВИТЬ:

Я бы посоветовал вам заставить контроллер представления подписаться на уведомление в установщике модели данных. Будет удобно хранить подписки-отписки в одном месте:

- (void)setDataModel:(YourDataModelClass*)dataModel
{
    [_dataModel removeObserver:self forKeyPath:@"myGame" context:nil];

    _dataModel = dataModel; // I hope you use ARC, otherwise check if the pointers are different.

    if (_dataModel != nil)
        [_dataModel addObserver:self forKeyPath:@"myGame" options:0 context:nil];
}

- (void)dataModelDidUpdate
{
    [self.tableView reloadData];
}

- (void)dealloc
{
    self.dataModel = nil; //An easy way to unsubscribe
}

Владелец контроллера представления отвечает за установку правильной модели данных при создании и при ее изменении.

person Davyd Geyl    schedule 15.07.2013
comment
Почему два контроллера представления не могут наблюдать за одной моделью данных? Это работает просто отлично. Обратите внимание, что в вопросе ОП модальное окно данных не имеет делегата. Используется обычный КВО. - person rmaddy; 15.07.2013
comment
Ничего плохого, я неправильно понял использование делегата. Не обращайте внимания на мой ответ, я обновлю его. - person Davyd Geyl; 15.07.2013