使用对象过滤NSSet以获取具有max属性值的对象

时间:2013-01-18 15:35:56

标签: ios objective-c core-data filtering

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

我只是想以有效的方式使用max dateCreated来获取消息。

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

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

我的对象来自Core Data可能有帮助吗?有什么想法吗?

3 个答案:

答案 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];
}