将containsObject与来自不同文件的对象数组一起使用

时间:2011-06-27 17:49:07

标签: objective-c xcode comparison nsmutablearray

所以我有一个名为ArtPiece的类,它定义了公共艺术品的几个属性,如标题,描述等。我将ArtPiece对象存储在appDelegate中一个名为mapAnnotations的数组中,这样它们就是全局的,它们将放在一个作为注释映射。当地图区域改变时,我进行URL调用以获取进入该区域的艺术品的信息,从解析的信息中制作artPiece对象,然后将它们添加到名为“ArtsXMLParser”的类中的名为items的数组中。我希望mapAnnotations能够保存地图上的所有艺术作品,但是当区域发生变化时,我只想添加来自mapAnnotations中尚未存在的“项目”的艺术作品,以免在地图上放置重复的注释。这是管理注释的第三类中的方法。一切似乎都有效,但每次都会调用带有containsObject的if语句,所以显然艺术品永远不会匹配,虽然它们被记录时它们具有相同的信息。有没有更好的方法来查看两个数组是否有一个具有完全相同属性的对象?

-(void)requestFinished:(ASIHTTPRequest *)request{
    //NSLog(@"requestFinished:");

    //NSLog(@"%@", [request responseString]);
    mainDelegate = (PublicArtAppDelegate*)[[UIApplication sharedApplication]delegate];      
    ArtsXMLParser *parser = [[ArtsXMLParser alloc] init];
    [parser parseXMLWithData:[request responseData] parseError:nil];
    newAnnots = [[NSMutableArray alloc] init];

    for (int xy = 0; xy<[parser items].count; xy++) 
    {
        if (![mainDelegate.mapAnnotations containsObject:[[parser items]objectAtIndex:xy]])
        {
            NSLog(@"%@", [[parser items]objectAtIndex:xy]);
            [self.newAnnots addObject:[[parser items]objectAtIndex:xy]];            
            NSLog(@"%@", [newAnnots objectAtIndex:xy]);
            [mainDelegate.mapAnnotations addObject:[[parser items]objectAtIndex:xy]];
            NSLog(@"%@", [mainDelegate.mapAnnotations objectAtIndex:xy]);
        }
    }
    //mainDelegate.mapAnnotations = [parser items];
    [parser release];

    [self.mapView addAnnotations:self.newAnnots];
    [newAnnots removeAllObjects];
    //[mainDelegate.mapAnnotations addObject:newAnnots];
    [newAnnots release];
    if (mainDelegate.mapAnnotations==0) {
        UIAlertView *alert2 = [[UIAlertView alloc] initWithTitle:nil message:@"No art work match your search term" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert2 show];
        [alert2 release];
    }
}

我很乐意澄清任何未解释清楚的事情。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

ArtPiece对象中,您需要继承isEqual:方法,以便在两个artPieces相等时返回YES。此方法的默认实现只是比较单个对象的指针值,在您的情况下,这不是您想要的。

有关子类化时需要注意的一些细节,请参阅Apple关于isEqual:方法的文档。