iphone为什么要使用valueForKeyPath

时间:2009-08-29 14:59:54

标签: iphone objective-c

我在互联网上找到了一些看起来像这样的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 个答案:

答案 0 :(得分:4)

他正在使用valueForKeyPath:构造返回所有注释的所有坐标数组。

假设self.mapViewMKMapView,那么它具有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];

总而言之,它只是使代码更简单,更容易阅读。