代码之家  ›  专栏  ›  技术社区  ›  choise

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

  •  1
  • choise  · 技术社区  · 14 年前

    我有一个从数据源对象创建的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;
    }
    

    通过这个,我可以使用我的fetchedResultController和我的 pubTime 这是一个时间戳。

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

    感谢大家

    1 回复  |  直到 14 年前
        1
  •  2
  •   robinjam    14 年前

    通常,当您希望在 UITableView ,你使用 NSFetchedResultsController . 可以通过指定 sectionNameKeyPath 初始化期间。

    这就是说,如果你的方法有效,那么你是否想改变你的代码就取决于你了。

    但是请确保你 [returnArray autorelease] 在你还它之前。任何名称中没有“alloc”、“new”或“copy”的方法都将返回一个自动释放的对象,这是一个普遍接受的客观C实践。