我使用的是NSFetchedResultsController,需要根据最新的日期和名称返回不同的对象。每个日期都存储为NSDate。
示例:
Object1 名称:Object1 日期:01/01/2001
Object2的 名称:对象 日期:01/02/2001
Object3 名称:OtherObject 日期:2001年1月10日
Object4 名称:OtherObject 日期:02/01/2001
预期结果(找到重复项时仅返回最新日期对象):
名:对象 日期:01/02/2001
名:OtherObject 日期:02/01/2001
//下面会返回正确排序的所有内容,尽管我只需要根据日期进行最新的匹配。
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Object" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Create the sort descriptors array.
NSSortDescriptor *name = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSSortDescriptor *date = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:name, date, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
修改 截至目前,我正在将所有对象提取到一个数组中,对于array1中的每个对象,我循环并将其与array2中具有相同名称的最新匹配对象相加/比较,并从array2中删除最旧的日期条目然后我就是在array2中留下了唯一的最新日期。我希望用一个fetchrequest /子查询来做一个不那么繁琐的方法。
答案 0 :(得分:0)
核心数据不会自动跟踪广告订单。当您获取取回的对象时,其实体将以任何随机顺序。
我对此的直接想法是,您需要另一个属性来跟踪插入时间并按此属性重新排序/排序。
因此,您的属性需要是一个带秒的日期时间。你会这样称呼:
NSDate *now = [[NSDate alloc] init];
并将其存储在属性中。获取对象时,请按此属性的键进行排序。
答案 1 :(得分:0)
试试这个......
name
的NSSet以返回唯一的数据集。date
的最新属性name
。例如:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSArray *objects = [self.managedObjectContext executeFetchRequest:fetchRequest];
NSMutableArray *arrayObjectNames = [[NSMutableArray alloc] init];
for (Object *object in objects) {
[arrayObjectNames addObject:object.name];
}
NSSet *setObjectNames = [NSSet setWithArray:arrayObjectNames];
NSString *key = @"name";
NSMutableDictionary *dictNamesDates = [NSMutableDictionary dictionary];
for (NSString *objectName in setObjectNames) {
NSFetchRequest *fetchName = [[NSFetchRequest alloc] initWithEntityName:@"Object"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", key, objectName];
[fetchName setPredicate:predicate];
NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
[fetchName setSortDescriptors:@[sortDate]];
Object *targetObject = [[self.managedObjectContext executeFetchRequest:fetchName] lastObject];
if (targetObject) [dictNamesDates setObject:targetObject.date forKey:objectName];
//OR as an alternative but achieving the same outcome...
if (targetObject) [dictNamesDates setValue:targetObject.date forKey:targetObject.name];
}
这应该创建一个NSMutableDictionary
,其中包含每个属性name
作为键,相应的最新属性date
作为值。
这有帮助吗?