使用数组的顺序对包含in子句的NSPredicate进行排序

3

我有一个NSPredicate,它在一个NSArray中对id进行搜索,类似于:

('id in %@',array)

有没有办法按照相同的数组顺序对该检索结果集进行排序?

我现在的代码是:

+(NSArray*)     findIn:(NSArray*)identifiers{

    if(identifiers == nil) return nil;

    NSPredicate *searchFilter   = [NSPredicate predicateWithFormat:@"id IN %@", identifiers];
    NSArray     *fetchedObjects =  [GSBaseModel setupFetch:[[self class] managedObjectEntityName] andFilter:searchFilter andSortKey:nil];

    if([fetchedObjects count] == 0){
        return nil;
    }
    return fetchedObjects;
}

安装程序只执行以下操作:
NSFetchRequest      *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity   = [NSEntityDescription entityForName:entityName inManagedObjectContext:[NSManagedObjectContext MR_defaultContext]];
[fetchRequest setEntity:entity];
return  = [[NSManagedObjectContext MR_defaultContext] executeFetchRequest:fetchRequest error:&error];

你指的是按照相同的数组顺序排序吗?你是指按照id排序吗? - Daniel Galasko
我的数组是一个已经排序好的ID数组,例如[3,5,1,2,4],因此我需要获取的结果也按照这个顺序排列。 - Jordi Puigdellívol
你是否正在使用Core Data?因为那么你可以使用排序描述符。否则,有无数种方法可以对数组进行排序。 - Daniel Galasko
是的,我正在使用核心数据,我要查一下排序描述符是什么。 - Jordi Puigdellívol
你试过了吗?我期望它已经排序了(假设你的源对象确实是一个NSArray)。展示一些实际的代码会是个好主意... - Wain
是的,我尝试过了,但它们没有排序,我刚刚更新了问题并附上了代码。 - Jordi Puigdellívol
2个回答

1
如果您想获取核心数据对象并将它们与ID数组链接起来,您应该考虑使用非常强大的NSDictionary:
因此,一旦您获取了所有对象,只需将这些对象存储在由ID键控的字典中即可:
NSDictionary *managedObjectsKeyedByID = [NSDictionary dictionaryWithObjects:fetchedObjects forKeys:[fetchedObjects valueForKey:@"identifier"]];

现在您可以遍历数组并使用您的字典检查匹配项:
for (NSString *identifier in arrayOfServerIDs) {
    NSManagedObject *existingObject = managedObjectsKeyedByID[identifier];
    if(!existingObject) {
       //insert a new one
    } else {
       //update
    }
}

但是这将按照ID排序返回,而不是按照我的数组顺序。 - Jordi Puigdellívol
@JordiPuigdellívol,那么你的数组顺序是什么?为什么要对已经排序过的数组进行排序? - Daniel Galasko
我有一个已排序 ID 数组,然后我需要使用这些 ID 在核心数据上进行提取,但结果是随机排序的,我需要与 ID 数组相同顺序的结果。 - Jordi Puigdellívol
为什么需要对它们进行排序?干嘛不直接把核心数据结果放在按 ID 键控的字典中呢?让我更新我的答案。 - Daniel Galasko

1

我最终是这样解决的

多亏了根据另一个字符串数组的排序对自定义对象的NSArray进行排序

+(NSArray*)sortWithArray:(NSArray*)toSort sorted:(NSArray*)sortedIdentifiers{
    NSMutableArray *sorted = [NSMutableArray array];

    // pre-populate with objects
    for (int i = 0; i < sortedIdentifiers.count; i++)
    {
        [sorted addObject:[NSNull null]];
    }
    // place the items at the correct position
    for (NSManagedObject *a in toSort)
    {
        NSNumber* identifier = [a valueForKey:@"id"];
        NSUInteger idx = [sortedIdentifiers indexOfObject:[identifier stringValue]];
        if (idx != NSNotFound)
        {
            [sorted setObject:a atIndexedSubscript:idx];
        }
    }
    // finally remove all the unecesarry placeholders if one array was smaller
    [sorted removeObject:[NSNull null]];
    return sorted;
}

1
这非常低效,当你可以使用字典时就不需要排序。请看我的答案。 - Daniel Galasko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接