我有一个从数据源对象
创建的NSMutableArrayNSMutableArray *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
中创建了以下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"];
感谢所有
答案 0 :(得分:2)
通常,如果要在UITableView
中显示核心数据提取的结果,请使用NSFetchedResultsController
。您可以通过在初始化期间指定sectionNameKeyPath
来选择要对结果进行分组的属性。
也就是说,如果您的方法有效,那么您是否想要更改代码是真的由您决定。
但请在退货前确认[returnArray autorelease]
。这是一个普遍接受的Objective-C实践,任何名称中没有“alloc”,“new”或“copy”的方法都将返回一个自动释放的对象。