为分组的uitableview准备核心数据结果集

时间:2010-07-14 06:04:54

标签: iphone objective-c uitableview core-data

我有一个从数据源对象

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

[self setAmountArray: mutableFetchResults];

我的可变数组中的每个对象都有两个实例变量nametimeadded

现在我想在按照添加日期分组的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中创建了以下getter方法。

- (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;
}

有了这个,我可以使用我的FetchedResultController和我的pubTime这个时间戳来按日期排序我的tableviewcontroller。

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

感谢所有

1 个答案:

答案 0 :(得分:2)

通常,如果要在UITableView中显示核心数据提取的结果,请使用NSFetchedResultsController。您可以通过在初始化期间指定sectionNameKeyPath来选择要对结果进行分组的属性。

也就是说,如果您的方法有效,那么您是否想要更改代码是真的由您决定。

但请在退货前确认[returnArray autorelease]。这是一个普遍接受的Objective-C实践,任何名称中没有“alloc”,“new”或“copy”的方法都将返回一个自动释放的对象。