使用对象过滤NSSet以获取具有最大属性值的对象
问题描述:
我有一个名为messages
的复杂对象的NSSet。每封邮件都有一个属性dateCreated
。使用对象过滤NSSet以获取具有最大属性值的对象
我只是试图以有效的方式获取消息与最大dateCreated
。
我仍然可以通过使用KVC最大日期: NSDate *d = [messages valueForKeyPath:@"@max.dateCreated"];
我认为它的错误的方式,要求的最大值和比对选择正确的消息循环。
也许这有助于我的对象来自Core Data?有任何想法吗?
答
如果您使用的是核心数据,则应运行一个提取请求,按创建的日期进行排序,然后返回第一个项目。此代码是未经测试,但它应该是这样的:因为您是通过对象需要循环反正
- (MyEntity *)newestMyEntityInContext:(NSManagedObjectContext *)context
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"entity"];
[request setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"dateCreated"
ascending:NO]]];
[request setFetchLimit:1];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:request
error:&error];
if (!results) {
NSLog(@"%@", error);
return nil;
}
return results.count ? results[0] : nil;
}
+0
谢谢!我不知道,我可以再次使用获取对象的上下文。大! –
答
,只需使用快速列举:
// Find the object with the maximum value for dateCreated
// Of course, replace both NSObject's with the appropriate class
NSObject *maxObject;
for (NSObject *object in messages)
{
if ([object.dateCreated laterDate:maxObject.dateCreated]))
maxObject = object;
}
答
如果你只是有一个NSSet中和不要使用CoreData,以下方法有效:
NSSortDescriptor *dateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dateCreated" ascending:YES];
NSArray *sortDescriptors = @[ dateDescriptor ];
NSArray *sortedArray = [messages sortedArrayUsingDescriptors:sortDescriptors];
if (sortedArray.count>0)
{
id oldestMessage = [sortedArray firstObject];
id newestMessage = [sortedArray lastObject];
}
如果您使用的是核心数据,请按创建的日期排序运行提取请求,然后选择第一项。 –