0

我有一个复杂对象的 NSSet,称为messages. 每条消息都有一个属性dateCreated

我只是想以dateCreated一种有效的方式获取最大值的消息。

我仍然可以使用 KVC 获得最大日期: NSDate *d = [messages valueForKeyPath:@"@max.dateCreated"];

我认为这是错误的方式来要求最大值,而不是循环选择正确的消息。

也许我的对象来自 Core Data 会有所帮助?有任何想法吗?

4

3 回答 3

2

如果你使用 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;
}
于 2013-01-18T17:09:29.593 回答
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;
}
于 2013-01-18T17:11:09.900 回答
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];
}
于 2015-04-27T09:32:07.130 回答