我有一个复杂对象的 NSSet,称为messages
. 每条消息都有一个属性dateCreated
。
我只是想以dateCreated
一种有效的方式获取最大值的消息。
我仍然可以使用 KVC 获得最大日期:
NSDate *d = [messages valueForKeyPath:@"@max.dateCreated"];
我认为这是错误的方式来要求最大值,而不是循环选择正确的消息。
也许我的对象来自 Core Data 会有所帮助?有任何想法吗?
我有一个复杂对象的 NSSet,称为messages
. 每条消息都有一个属性dateCreated
。
我只是想以dateCreated
一种有效的方式获取最大值的消息。
我仍然可以使用 KVC 获得最大日期:
NSDate *d = [messages valueForKeyPath:@"@max.dateCreated"];
我认为这是错误的方式来要求最大值,而不是循环选择正确的消息。
也许我的对象来自 Core Data 会有所帮助?有任何想法吗?
如果你使用 Core Data,你应该运行一个 fetch 请求,按创建日期排序,然后返回第一个项目。这段代码未经测试,但它应该是这样的:
- (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;
}
由于无论如何您都需要遍历对象,因此只需使用快速枚举:
// 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];
}