基于数组排序NSFetchedResultsController结果?
我想构建一个基于数组内容的NSPredicate或NSSortDescriptor(核心数据搜索)。
该数组将按正确的顺序包含userId:s
:
[1, 2, 5, 3];
我想以相同的顺序呈现我的NSFetchedResultsController的结果。
所以我会:
- 找到合适的用户(我已经这样做了)
- 使用
userId
s根据我的排序数组对用户列表进行排序。
这可能吗,我该怎么做?
我认为这是不可能的。 对获取请求的结果(对于基于SQLite的存储)的排序是在SQLite级别上完成的,并且只能使用存储在数据库中的持久属性。 排序描述符不能使用Objective-C函数或变量。
所以要么
- 您向实体添加了一个描述预期排序的附加属性(如果可能的话),或者
- 在获取结果后,您可以根据需要对结果进行排序(这意味着您无法再使用获取的结果控制器进行自动更改跟踪)。 也许你可以使用这里描述的方法: https : //stackoverflow.com/a/15618277/1187415 。
上面的答案并不完全正确。 你可以做你想做的事,但有点复杂。
- 在NSNumber上创建一个类别(userID是一个数字,对吧?)
-
使用objc_setAssoc将NSArray类型的+全局变量放入类别中….
@interface NSNumber(MyExtension) + (NSArray *) orderingArray; + (void) setOrderingArray: (NSArray *)array; - (NSComparisonResult) myOwnCompareMethodUsingArray:(NSNumber *)theOtherNumber; @end int keyVar = 0; @implementation NSNumber(MyExtension) + (NSArray *) orderingArray { return objc_getAssociatedObject(self, &keyVal); } + (void) setOrderingArray: (NSArray *)array { objc_setAssociatedObject(self, &keyVal, array, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (NSComparisonResult) myOwnCompareMethodUsingArray:(NSNumber *)theOtherNumber; { NSArray *a = [self.class orderingArray]; if(!a) return NSOrderedSame; return [@([a indexOfObject:self]) compare: @([a indexOfObject:theOtherNumber])]; }
-
将数组设置在某处:
[NSNumber setOrderingArray:myArrayWithKeys];
-
使用类型的排序描述符:
[NSSortDescriptor sortDescriptorWithKey:@"userId" ascending:YES selector @selector(myOwnCompareMethodUsingArray:)]
这显然适用于具有localizedCaseInsensitiveCompare的字符串:但是,如果它足够大并且覆盖任何fetchLimit / fetchOffset优化,它将降低查询的性能。 请记住,您正在操作的字段必须是唯一的,否则它将全部下地狱。
- 如何更改UICollectionView zIndex?
- 在17分钟内构建一个Swift Photo App
- 如何在每次构build(运行)xcode 4中的ios应用程序之前自动运行OCUnit逻辑testing?
- 在iOS应用程序中使用macrosSEC_IS_BEING_DEBUGGED_RETURN_NIL
- UICollectionView单元格,自动布局和collectionview布局的变化
- 为什么calloutAccessoryControlTapped也被称为在注解视图上点击?
- Facebook登录 – 停留在白色网页SWIFT
- 核心数据Swift在优化的版本中抛出generics函数失败
- UITableViewCell配置实践