също така git shortlog -sn --no-merges премахване на ангажиментите за сливане от броя.

person MathewS    schedule 03.05.2012    source източник


Отговори (2)


Не трябва да правите директни публични свойства за променливи колекции, за да избегнете мутирането им без ваше знание. NSArray сам по себе си не може да се наблюдава ключ-стойност, но вашето свойство @"events" е. Ето как да го наблюдавате:

Първо, декларирайте публична собственост за неизменна колекция:

@interface Model
@property (nonatomic, copy) NSArray *events;
@end

След това във вашата реализация го върнете с променлив ivar:

@interface Model ()
{
    NSMutableArray *_events;
}
@end

и заменете getter и setter:

@implementation Model

@synthesize events = _events;

- (NSArray *)events
{
    return [_events copy];
}

- (void)setEvents:(NSArray *)events
{
    if ([_events isEqualToArray:events] == NO)
    {
        _events = [events mutableCopy];
    }
}

@end

Ако други обекти трябва да добавят събития към вашия модел, те могат да получат променлив прокси обект чрез извикване на -[Model mutableArrayValueForKey:@"events"].

NSMutableArray *events = [modelInstance mutableArrayValueForKey:@"events"];
[events addObject:newEvent];

Това ще задейства известия на KVO, като всеки път задава свойството с нова колекция. За по-добра производителност и по-подробен контрол внедрете останалата част от приспособления за достъп до масив.

Вижте също: Наблюдение на NSMutableArray за вмъкване/премахване.

person Ryder Mackay    schedule 03.05.2012
comment
Благодаря ти! mutableArrayValueForKey върши работа. Имате ли съвети как да изберете кой модел да използвате (KVO, NotificationCenter, делегат), когато искате да комуникирате между модел и контролер? - person MathewS; 04.05.2012
comment
Определено пропускам нещо тук. Може ли някой да обясни къде ще се извикат setEvents, ако някой добави или вмъкне Object: atIndex: обект към резервния променлив масив? - person Alex Zavatone; 29.03.2016

Според документи относно методите за достъп, трябва да внедрите:

- (void)addEventsObject:(Event*)e
{
    [_events addObject:e];
}

- (void)removeEventsObject:(Event*)e
{
    [_events removeObject:e];
}

След това KVO ще задейства известията, когато бъдат извикани.

person Bryan    schedule 20.03.2015