我有一个名为messages
的复杂对象的NSSet。每条消息都有一个属性dateCreated
。
我只是想以有效的方式使用max dateCreated
来获取消息。
我仍然可以通过使用KVC获得最长日期:
NSDate *d = [messages valueForKeyPath:@"@max.dateCreated"];
我认为要求最大值的方法是错误的,而不是循环选择正确的消息。
我的对象来自Core Data可能有帮助吗?有什么想法吗?
答案 0 :(得分:2)
如果您使用的是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;
}
答案 1 :(得分:2)
因为你需要遍历对象,所以只需使用快速枚举:
// 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;
}
答案 2 :(得分:1)
如果您只有一个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];
}