Использование containsObject с массивами объектов из разных файлов - PullRequest
0 голосов
/ 27 июня 2011

Итак, у меня есть класс ArtPiece, который определяет несколько атрибутов общедоступных художественных произведений, таких как заголовок, описание и т. Д. Я храню объекты ArtPiece в массиве с именем mapAnnotations в appDelegate, поэтому они будут глобальными, и они будут помещены в Карта как аннотации. Когда область карты изменяется, я делаю URL-вызов, чтобы получить информацию о artpieces, которые вошли в область, создаю объекты artPiece из проанализированной информации, затем добавляю их в массив с именем items в классе с именем «ArtsXMLParser». Я хочу, чтобы mapAnnotations содержала все фрагменты, которые находятся на карте, но когда регион изменяется, я хочу добавить только фрагменты из "элементов", которых еще нет в mapAnnotations, чтобы не размещать дубликаты аннотаций на карте. Вот метод в третьем классе, который управляет аннотациями. Кажется, что все работает, но оператор if с containsObject: вызывается каждый раз, поэтому, очевидно, artpieces никогда не совпадают, хотя, когда они регистрируются, они имеют одинаковую информацию. Есть ли лучший способ проверить, имеют ли два массива объект с одинаковыми общими атрибутами?

-(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 Ответ

1 голос
/ 27 июня 2011

В вашем ArtPiece объекте вы должны создать подкласс метода isEqual:, чтобы он возвращал YES, когда два artPieces равны.Реализация этого метода по умолчанию просто сравнивает значения указателя для отдельных объектов, что, в вашем случае, не то, что вам нужно.

См. Документацию Apple по методу isEqual: для некоторых деталей.что вы должны знать при создании подклассов.

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