проблема с NSSortDescriptor. Я сортирую в порядке возрастания (в алфавитном порядке)

Я использую NSSortDescriptor для сортировки пользовательских объектов с ключом bandName, но я не получаю вывод в алфавитном порядке. Как это исправить?

-(void)getdetails
{
    NSLog(@"in getdetail method");
    SongRequestAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context1 = [appDelegate managedObjectContext];
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"AddToFav" inManagedObjectContext:context1];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesc];
    NSError *error;
    NSMutableArray *array_new=[[NSMutableArray alloc]init];
    [array_new addObjectsFromArray:[context1 executeFetchRequest:request error:&error]];
    //[self.fetchedObjects addObjectsFromArray:[context1 executeFetchRequest:request error:&error]];
    [request release];

**NSSortDescriptor *sortDescriptor;
    sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"bandName" ascending:YES] autorelease];
    NSMutableArray *sortDescriptors = [NSMutableArray arrayWithObject:sortDescriptor];

    //self.fetchedObjects=
    [array_new sortedArrayUsingDescriptors:sortDescriptors];
    [self.fetchedObjects addObjectsFromArray:array_new];
    [array_new release];**
    for (int i=0; i<[self.fetchedObjects count];i++)
    {
        NSManagedObject 
        *addfav=[self.fetchedObjects objectAtIndex:i];
        addFavObject *addfavobject=[[addFavObject alloc]init];
        addfavobject.bandImagePath=[addfav valueForKey:@"bandImagePath"];
        addfavobject.bandId=[addfav valueForKey:@"bandId"];
        addfavobject.bandName=[addfav valueForKey:@"bandName"];
        addfavobject.songId=[addfav valueForKey:@"songId"];
        addfavobject.songListId=[addfav valueForKey:@"songListId"];
        addfavobject.songName=[addfav valueForKey:@"songName"];
        addfavobject.bandRealName=[addfav valueForKey:@"bandRealName"];
        addfavobject.biography=[addfav valueForKey:@"biography"];
        NSLog(@"addto fav object biography is %@",addfavobject.biography);
    [self.addTofavObjectArray addObject:addfavobject];
        [addfavobject release];
    }

    //NSArray *reverse = [[self.addTofavObjectArray reverseObjectEnumerator] allObjects];
    //    [self.addTofavObjectArray removeAllObjects];
    //  [self.addTofavObjectArray addObjectsFromArray:reverse];

    NSLog(@"self.addTofavObjectArray is %@",self.addTofavObjectArray);

    NSLog(@"FETCHED OBJECTS count is %d",[self.fetchedObjects count]);  
}

person girish    schedule 30.04.2011    source источник


Ответы (1)


sortedArrayUsingDescriptors: не сортирует на месте массив, в который он был отправлен. Он возвращает новый массив с отсортированными объектами. Он должен работать с:

NSArray *sortedArray = [array_new sortedArrayUsingDescriptors:sortDescriptors];
[self.fetchedObjects addObjectsFromArray:sortedArray];

Однако вам не нужно делать сортировку отдельно. Вы можете указать дескрипторы сортировки для вашего запроса на выборку, и массив, возвращенный в результате его выполнения, будет отсортирован. Я настоятельно рекомендую делать это так, а не так, как вы это делаете. Таким образом, вы можете заменить все перед циклом for на:

    SongRequestAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context1 = [appDelegate managedObjectContext];
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"AddToFav" inManagedObjectContext:context1];

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"bandName" ascending:YES] autorelease];
    NSMutableArray *sortDescriptors = [NSMutableArray arrayWithObject:sortDescriptor];
    [sortDescriptor release];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesc];
    [request setSortDescriptors:sortDescriptors];

    NSError *error;
    NSMutableArray *array_new = [context1 executeFetchRequest:request error:&error];

    if (!array_new)
    {
        NSLog(@"error: %@", error);
    }

    [self.fetchedObjects addObjectsFromArray:array_new];
    [request release];

Я также добавил в проверку для array_new вывод ошибки. Возможно, вы захотите добавить туда дополнительную обработку ошибок.

person McCygnus    schedule 30.04.2011