我有一个Wishlist
实体和一个Item
实体。它们具有双边到多个可选关系,即一个项目可以在0或更多的愿望清单中,愿望清单可以包含0个或更多项目。
如果我wishlist.items
,我会收到某个心愿单中的所有项目。现在,我想做一个获取请求,并按照心愿单名称的字母顺序排序所有我的愿望清单(就像它现在正在做的那样),但是这些愿望清单是否有物品。
它应该使用2个优先级对Wishlist
进行排序:
1 - 按愿望清单是否包含物品排序(放置不在顶部的物品)
2 - 如果绑定则按名称排序(如果两者都有/没有项目)
所以,如果我有3个愿望清单,一个有两个名为'apple'的项目,另一个没有名为'test'的项目,另一个有3个名为'android'的项目,它应按如下方式排序,从上到下:
1. test
2. android
3. apple
如何使用排序描述符实现此目的?我的谓词是nil
,因为我正在获取Core Data中的所有愿望清单。
答案 0 :(得分:1)
解决这个问题的一种方法是:
获得两套愿望清单(一套带有物品,一套没有)
NSPredicate *withoutItems = [NSPredicate predicateWithFormat:@"items.@count == 0"];
NSPredicate *withItems = [NSPredicate predicateWithFormat:@"items.@count != 0"];
其中每个应该在获取请求中具有相同的排序描述符:
NSSortDescriptor *byName = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
现在执行请求后,您应该有两个(已排序)数组:
// Provided that you have a managedObjectContext
// and your fetch requests set up
NSArray *emptyLists = [moc executeFetchRequest:requestForEmpty error:&error];
NSArray *nonEmptyLists = [moc executeFetchRequest:requestForNonEmpty error:&error];
如果您需要某种统一的数据源,最后可以将它们组合起来:
NSArray *allSorted = [emptyLists arrayByAddingObjectsFromArray:nonEmptyLists];