подготовка основного результирующего набора данных для сгруппированного uitableview - PullRequest
1 голос
/ 14 июля 2010

У меня есть NSMutableArray, созданный из объекта источника данных

NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 

[self setAmountArray: mutableFetchResults];

каждый объект в моем изменяемом массиве имеет две переменные экземпляра name и timeadded.

теперь я хочу отобразить все имена в uitableview, сгруппированные по дням их добавления. для этого я написал следующий метод

-(NSMutableArray*)arrangeTransfersByDate:(NSMutableArray*)transferArray {

    // Setting up objects for this method
    NSDate *oldDate = [NSDate dateWithTimeIntervalSince1970:0.0f];
    NSDateFormatter *dateComparisonFormatter = [[NSDateFormatter alloc] init];
    [dateComparisonFormatter setDateFormat:@"yyyy-MM-dd"];
    NSMutableArray *returnArray = [[NSMutableArray alloc] init];

    for(transfers *transfer in transferArray) {

        if( [[dateComparisonFormatter stringFromDate:[transfer timeadded]] isEqualToString:[dateComparisonFormatter stringFromDate:oldDate]] ) {
            if([returnArray count] == 0) {
                [returnArray addObject:[NSMutableArray arrayWithObject:transfer]];
            } else {
                [[returnArray objectAtIndex:[returnArray count]-1] addObject:transfer];
            }
        } else {
            [returnArray addObject:[NSMutableArray arrayWithObject:transfer]];
            oldDate = [transfer timeadded];
        }

    }
    //[returnArray release];
    [dateComparisonFormatter release];
    return returnArray;


}

transferArray - это мой amountArray, где хранятся мои основные объекты данных.

так что это работает! но

есть ли лучший способ сделать это? Можете ли вы дать мне что-то вроде «лучшей практики» или просто посмотреть, есть ли утечки памяти?

спасибо!


редактирование:

правильный ответ был NSFetchedResultController и его sectionNameKeyPath.

однако я не хотел хранить свои данные дважды.

поэтому я создал следующий метод получения в моем NSManagedObject.

- (NSString *) pubDate {

    [self willAccessValueForKey:@"pubDate"];

    NSDateFormatter *dateComparisonFormatter = [[NSDateFormatter alloc] init];
    [dateComparisonFormatter setDateFormat:@"dd.MM.YYYY"];
    NSString *temp = [dateComparisonFormatter stringFromDate:[self pubTime]];
    [dateComparisonFormatter release];

    [self didAccessValueForKey:@"pubDate"];

    return temp;
}

с этим я могу отсортировать свой tableviewcontroller по дате, используя мой FetchedResultController и мой pubTime, который является отметкой времени.

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                              managedObjectContext:[self managedObjectContext] 
                                                sectionNameKeyPath:@"pubDate" 
                                                         cacheName:@"transfersRoot"];

спасибо всем

1 Ответ

2 голосов
/ 14 июля 2010

Обычно, когда вы хотите отобразить результаты выборки базовых данных в UITableView, вы используете NSFetchedResultsController. Вы можете выбрать атрибут, по которому вы хотите сгруппировать результаты, указав sectionNameKeyPath во время инициализации.

Тем не менее, если ваш метод работает, то на самом деле вам решать, хотите ли вы изменить свой код или нет.

Но, пожалуйста, убедитесь, что вы [returnArray autorelease], прежде чем вернуть его. Это общепринятая практика Objective C, что любой метод без «alloc», «new» или «copy» в имени будет возвращать объект с автоматическим освобождением.

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