过滤对象的最佳/最有效的方法

时间:2013-09-09 14:58:29

标签: objective-c loops annotations

在我的应用程序中,我在地图上显示多个annoations。我有很多不同的注释,但基本上我有12种不同的注释,每种注释都有自己的图像(所以有12种不同的注释图像)。

现在在我当前的代码中,我将MKAnnotation子类化,并给它一个属性,我称之为“标识符”,当我创建一个注释时,这个标识符将设置为适当的值,以便稍后我可以过滤一组特定的注释并给出它们是viewForAnnotation中的正确图像。

- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation {
CustomAnnotation *pin = annotation;
MKAnnotationView *pinView=nil;

if ([annotation isKindOfClass:[MKUserLocation class]]) {

    return nil;
}
else if ([pin.identifier isEqualToString:@"tree"]) { //give annotation a tree image
    pinView = (MKPinAnnotationView *)[aMapView dequeueReusableAnnotationViewWithIdentifier:@"OwnerAnnotationString"];
    pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"OwnerAnnotationString"];
    pinView.image = [UIImage imageNamedForDevice:@"tree"];
    pinView.centerOffset = CGPointMake(0, -53/2);
    return pinView;
}
else if ([pin.identifier isEqualToString:@"house"]){ //give annotation a house image
    pinView = (MKPinAnnotationView *)[aMapView dequeueReusableAnnotationViewWithIdentifier:@"SmallGoldPinStringAnkeren"];
    pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"anotheridentifier"];
    pinView.image = [UIImage imageNamedForDevice:@"house"];
    pinView.centerOffset = CGPointMake(8, -43/2);

    return pinView;
}
//and so on

我不喜欢这个,如果过滤过程效率非常低,那么我想知道为不同的注释设置图像的最佳和最快的方法是什么。

最后这个例子是用注释完成的,但我现在多次遇到这个场景,所以实际上我的问题是:

检查您正在与哪种对象进行交互的最佳方法是什么,这样您就可以在Objective-C中为该特定对象设置适当的值。

1 个答案:

答案 0 :(得分:0)

不是给每个注释赋予标识符,而是将它们放在NSmutableArray中,并将该数组放在NS(Mutable)Dictionary中。让字典中的密钥成为您现在拥有的标识符。这样注释已经在创建时排序,如果你需要它们,在一个数组中,你可以简单地创建一个新的可变数组,并将字典中数组中的所有对象添加到它。