Наблюдение зависимых ключей по отношению ко многим - PullRequest
8 голосов
/ 01 июня 2011

У меня есть сущность Core Data, "bid", которая имеет отношение ко многим "элементам", называемой "itemLink".

в IB, у меня есть текстовое поле, привязанное к "total", иэто почти работает.

В "bid.m" у меня есть:

- (NSDecimalNumber *)total
{
    return [self valueForKeyPath:@"itemLink.@sum.price"];
}

У меня также есть:

+ (NSSet *)keyPathsForValuesAffectingTotal { 
    return [NSSet setWithObjects:@"itemLink", nil]; 

}

При добавлении или удалении элемента "всего"обновления, как и ожидалось.Но если вы измените «элемент» в наборе itemLink, итог не обновится.Как вы получаете KVO, чтобы увидеть, когда связанный объект в связанном NSSet изменился?

Спасибо

Ответы [ 2 ]

7 голосов
/ 08 июня 2011

Похоже, ваша проблема связана с тем, что в keyPathsForValuesAffectingTotal упоминается только keyPath "itemLink".

Поскольку это путь отношения ко многим, вы фактически указываете свой объект ставки.соблюдать множество изменений.Все, что делает набор, это управляет, являются ли объекты его членами или нет.Это объясняет, почему вы получаете обновления, когда элементы добавляются или удаляются из «itemLink», но только это.

Вас интересует не только то, какие элементы являются членами набора, но и вас интересует(изменяемые) свойства этих членов - цена в этом случае.Таким образом, в дополнение к вышесказанному, вы хотите, чтобы каждый элемент itemLink уведомлял всех наблюдателей об общем ключе соответствующего объекта ставки, что «цена» изменялась при каждом изменении.

К сожалению, это не так простокак добавление «itemLink.price» в качестве зависимого пути к ключу в вашем классе Bid, поскольку KVO не позволяет вам наблюдать отношения «сквозь» ко многим.

Если вы используете подкласс NSManagedObject для экземпляров вашего Itemсущность, вы можете добавить эту функцию вручную.Переопределите + automaticallyNotifiesObserversForKey: в своем классе Item, чтобы сообщить Какао, что вы собираетесь управлять уведомлениями KVO вручную для ключа "price", а затем внедрите свой собственный метод setPrice:, который отправляет соответствующее уведомление.Примерно так:

- (void)setPrice:(id)inPrice
{
    // bid = inverse relationship of itemLink
    [[self valueForKey:@"bid"] willChangeValueForKey:@"total"];
    [self willChangeValueForKey:@"price"];

    [self setPrimitiveValue:inPrice forKey:@"price"];

    [self didChangeValueForKey:@"price"];
    [[self valueForKey:@"bid"] didChangeValueForKey:@"total"];
}
1 голос
/ 30 января 2013

Я написал некоторый код для поддержки зависимых ключей во многих отношениях.

https://github.com/macoun/DerivedDependency

Также поддерживается кэширование вычисленных значений.

...