Установка KVO для расчетных значений, на основе расчетных значений

Вы можете проверить ниже метод, который я сделал для получения текущего местоположения.

void _currentLocation() async {
    Location _location = new Location();
    Map<String, double> location;

    try {
      location = await _location.getLocation();
    } on PlatformException catch (e) {
      print(e.message);
      location = null;
    }

    mapController.animateCamera(CameraUpdate.newCameraPosition(
      CameraPosition(
        bearing: 0,
        target: LatLng(location["latitude"], location["longitude"]),
        zoom: 17.0,
      ),
    ));

    mapController.addMarker(
      MarkerOptions(
        position: LatLng(location["latitude"], location["longitude"]),
      ),
    );
  }
9
задан Peter Hosey 4 September 2009 в 14:51
поделиться

2 ответа

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

Путем я приблизился бы, это должно будет вручную наблюдать cost свойство каждого объекта InvoiceLineItem, путем реализации к - много средств доступа KVC для lineItems свойство на классе Счета, выполняющем в addObserver/removeObserver, называет вставить/удалить методы, соответственно, и затем инициировало totalCost изменитесь вручную использующий willChangeValueForKey:/didChangeValueForKey:. Так что-то вроде этого (примерно коротко изложенный код, правовые оговорки и т.д.):

- (void)insertObject:(InvoiceLineItem*)newItem inLineItemsAtIndex:(unsigned)index
{
    [newItem addObserver:newItem forKeyPath:@"cost" options:0 context:kLineItemContext];
    [lineItems insertObject:newItem atIndex:index];
}

- (void)removeObjectFromLineItemsAtIndex:(unsigned)index
{
    [[lineItems objectAtIndex:index] removeObserver:self forKeyPath:@"cost"];
    [lineItems removeObjectAtIndex:index];
}

- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
    if (context == kLineItemContext)
    {
        [self willChangeValueForKey:@"totalCost"];
        [self didChangeValueForKey:@"totalCost"];
    }
}
6
ответ дан 4 December 2019 в 23:41
поделиться

Вы можете попробовать более короткое решение.

Добавить в файл заголовка:

@property (retain, readonly) NSDecimalNumber *accountBalance;

Добавить в файл реализации

- (NSDecimalNumber *)totalCost
{
    return [self valueForKeyPath:@"InvoiceLineItems.@sum.cost"];
}
0
ответ дан 4 December 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: