iphone, почему он использует valueForKeyPath - PullRequest
2 голосов
/ 29 августа 2009

В интернете я нашел код mapkit, который выглядит следующим образом:

- (void)recenterMap {
NSArray *coordinates = [self.mapView valueForKeyPath:@"annotations.coordinate"];

CLLocationCoordinate2D maxCoord = {-90.0f, -180.0f};
    CLLocationCoordinate2D minCoord = {90.0f, 180.0f};
    for(NSValue *value in coordinates) {
        CLLocationCoordinate2D coord = {0.0f, 0.0f};
        [value getValue:&coord];
        if(coord.longitude > maxCoord.longitude) {
            maxCoord.longitude = coord.longitude;
        }

--omitted the rest

Я хочу знать, почему valueForKeypath используется для получения данных координат, а не просто

[self.mapView.annotations]

Это как-то связано со скоростью?

1 Ответ

4 голосов
/ 29 августа 2009

Он использует конструкцию valueForKeyPath: для возврата массива всех координат для всех аннотаций.

Если предположить, что self.mapView является MKMapView, то у него есть свойство annotations, которое возвращает массив объектов, соответствующих протоколу MKAnnotation. Это означает, что каждый объект в этом массиве должен реализовывать свойство coordinate. Посылая вызов [self.mapView valueForKeyPath:@"annotations.coordinate"], он сразу получает массив всех координат без необходимости перебирать каждый отдельный элемент аннотации в массиве.

Без использования конструкции KVC он должен был бы сделать нечто подобное:

NSMutableArray *coordinates = [NSMutableArray array];
for (id<MKAnnotation> annotation in self.mapView.annotations)
    [coordinates addObject:annotation.coordinate];

В целом, это упрощает чтение кода.

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