0

我有一个 MKMapKit,我正在使用从 API 获取的数据填充注释。每个注释都有一个标题、描述、URL 和坐标。我有一个添加到导航栏的按钮来获取更多结果并填充更多注释。问题在于,当 API 用完新结果时,会使用已获取的注释的副本填充地图。我正在尝试使用 if 语句从数组中删除重复的注释,但它不起作用。有什么建议么?提前致谢。

-(void)layAnnotations
{

if (self.annotations) {
    [self.mapView removeAnnotations:self.annotations];
}

self.annotations = [NSMutableArray array];

for (Object *aObject in self.objectArray) {
    CLLocationCoordinate2D coordinate;
    coordinate.latitude = [aObject.latitude floatValue];
    coordinate.longitude = [aObject.longitude floatValue];

    Annotations *annotation = [[Annotations alloc] init];



    annotation.title = aObject.objectTitle;
    annotation.subtitle = aObject.description;
    annotation.url = aObject.url;
    annotation.coordinate = coordinate;

    //attempting to filter duplicates here
    if (![self.annotations containsObject:annotation]) {
        [self.annotations addObject:annotation];
    }        

    annotation = nil;

}

[self mutateCoordinatesOfClashingAnnotations:self.annotations];

[self.mapView addAnnotations:self.annotations];

}
4

2 回答 2

1

因为您正在init为每个对象添加一个新注释,所以它们永远不会是相同的引用,这就是在containsObject. 相反,您可以遍历所有注解并检查新注解是否与现有注解的标题、副标题、url 和坐标(或您知道的唯一注解)匹配。

如果您想更多地参与,您可以覆盖 isEquals 函数,以便比较有效。这个例子展示了如何开始。这个想法是编写您的isEqualToWidget函数版本来比较每个注释的属性值。我认为这是更好的解决方案。

覆盖 isEqual: 和 hash 的最佳实践

于 2013-09-18T01:48:12.147 回答
1

假设 URL 是注释的唯一标识符,那么它应该是:

NSMutableArray *annotations = [NSMutableArray array];

for (Object *aObject in self.objectArray) {
    if (![[self.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"url == %@", aObject.url] count]) {
/* you also can construct your predicate like [NSPredicate predicateWithFormat:@"((title == %@) AND (coordinate.latitude == %f) AND (coordinate.longitude == %f) AND (subtitle == %@))", aObject.title, aObject.latitude.floatValue, aObject.longitude.floatValue, aObject.subtitle]; */
        CLLocationCoordinate2D coordinate;
        coordinate.latitude = [aObject.latitude floatValue];
        coordinate.longitude = [aObject.longitude floatValue];

        Annotations *annotation = [[Annotations alloc] init];
        annotation.title = aObject.objectTitle;
        annotation.subtitle = aObject.description;
        annotation.url = aObject.url;
        annotation.coordinate = coordinate;
        [self.annotations addObject:annotation];
    }
}

containsObject在这种情况下实际上永远不会返回YES,因为您每次都创建一个新对象,但不使用 annotations 数组中的相同对象

不要忘记确保您确实在做,否则您将始终从方法中NSMutableArray *annotations = [NSMutableArray array];收到空数组。filteredArrayWithPredicate:

于 2013-09-18T01:56:22.787 回答