Ios 基于有序对多关系的排序描述符
我的核心数据模型说明:Ios 基于有序对多关系的排序描述符,ios,objective-c,swift,core-data,Ios,Objective C,Swift,Core Data,我的核心数据模型说明: 项目和问题实体 项目与名为问题的问题具有一对多的有序关系 问题与名为parentProject的项目具有一对一关系 以下是获取问题的代码: let fetchRequest = NSFetchRequest(entityName: "Issue") fetchRequest.predicate = NSPredicate(format: "parentProject CONTAINS[cd] %@", argumentArray: [project])
- 项目和问题实体
- 项目与名为问题的问题具有一对多的有序关系
- 问题与名为parentProject的项目具有一对一关系
let fetchRequest = NSFetchRequest(entityName: "Issue")
fetchRequest.predicate = NSPredicate(format: "parentProject CONTAINS[cd] %@", argumentArray: [project])
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
let frc = NSFetchedResultsController(
fetchRequest: fetchRequest,
managedObjectContext: dataManager.context,
sectionNameKeyPath: nil,
cacheName: nil)
return arc
尽管我有来自项目对象的所有问题,但我更喜欢使用fetched results controller获取问题,因此它们将始终被更新,并且我喜欢与表的集成。我也喜欢在使用FRC显示项目之前,在导航控制器屏幕中显示
正如您在代码中看到的,问题是按name参数排序的
但是,我希望它们按照我在项目的NSMutableOrderedSet中保存的顺序进行排序。
AFAIK I在用于核心数据时不能将NSSortDescriptor与比较器/选择器一起使用
你知道怎么做吗?提前感谢。如果您使用关系键路径(在您的案例中是
parentProject
),它将根据排序集进行排序。所以你可以用
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "parentProject.name", ascending: true),NSSortDescriptor(key: "parentProject", ascending: true)]
这将首先按项目对它们进行排序,然后在每个项目组中,它将按照与关系中的有序集相同的顺序进行排序。或者,您可以使用sectionNameKeyPath
将每个问题的项目放在不同的部分
如果您不先使用
parentProject.name
(或类似于parentProject.lastUpdated
)的名称,则它们将仅根据orderedSet的顺序进行排序。换句话说,它将是所有的第一个问题,然后是所有的第二个问题等等。这可能不是您想要的。保持秩序的最简单方法是为“问题”实体添加属性。一种称为position
,类型为Int
。并使用排序描述符,按此位置
属性对实体进行排序这可能是一个错误,但无论如何。在我看来,你的第一次取回是一个过滤器。。e、 g.向我展示该项目的问题。也许您可以对选定的问题执行第二次提取,这次不过滤它们,而是对它们进行排序
关于CoreData,我有一个排序的获取,如下所示:
func fetchItem() {
print(#function)
let sortDescriptor: NSSortDescriptor!
let defaults: UserDefaults = UserDefaults.standard
if defaults.integer(forKey: "sequenceSwitchValue") == 0 {
sortDescriptor = NSSortDescriptor(key: "itemName", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))
} else {
sortDescriptor = NSSortDescriptor(key: "itemName", ascending: false, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))
}
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: itemEntity)
request.sortDescriptors = [sortDescriptor]
let predicate: NSPredicate = NSPredicate(format: "itemName == %@", incomingItemName)
request.predicate = predicate
do {
items = try context.fetch(request) as! [ItemEntity]
} catch let error as NSError {
print("Error While Fetching Data From DB: \(error.userInfo)")
}
if items.count > 0 {
let currentItem = items[0]
func fetchItem(){
打印(#功能)
让sortDescriptor:NSSortDescriptor!
默认设置:UserDefaults=UserDefaults.standard
如果默认值为.integer(forKey:“sequenceSwitchValue”)==0{
sortDescriptor=NSSortDescriptor(键:“itemName”,升序:true,选择器:#选择器(NSString.localizedCaseInsensitiveCompare(35;:))
}否则{
sortDescriptor=NSSortDescriptor(键:“itemName”,升序:false,选择器:#选择器(NSString.localizedCaseInsensitiveCompare(35;:))
}
让上下文=(UIApplication.shared.delegate为!AppDelegate)。persistentContainer.viewContext
let request=NSFetchRequest(entityName:itemEntity)
request.sortDescriptors=[sortDescriptor]
let谓词:NSPredicate=NSPredicate(格式:“itemName==%@”,incomingItemName)
request.predicate=谓词
做{
items=try context.fetch(请求)as![ItemEntity]
}将let错误捕获为NSError{
打印(“从数据库提取数据时出错:\(Error.userInfo)”)
}
如果items.count>0{
让currentItem=items[0]
您可以在谓词中使用关系值。您可能不想听到这些,但很遗憾,您不能。NSFetchedResultsController无法使用基于有序一对多关系的SortDescriptor进行排序。您应该向Apple提交一个bug。您应该抛弃NSFetchedResultsController并处理它的错误自己委派方法。为什么不使用:-NSSortDescriptor*sortStates=[NSSortDescriptor sortdescriptor with key:@“states”升序:无比较器:^(id obj1,id obj2){@Vizllx正如我在问题中提到的,带有比较器和选择器的排序描述符不能作为获取请求排序描述符***由于未捕获的异常“NSInvalidArgumentException”终止应用程序,原因:“不支持的NSSortDescriptor(不支持比较器块)”您能说出保留“问题”的参数吗作为Project中的OrderedSet?您是想让来自不同项目的问题分散在列表中,还是希望它们组合在一起?我过去遇到过这个问题,据我所知,在FetchRequest中不可能以“OrderedSet顺序”返回
OrderedSet
的内容。这不是你想要的答案,我能建议的最好办法是向苹果公司提出一个bug。你如何按parentProject
哪个是ObjectID进行排序?parentProject
是一种关系。核心数据足够聪明,可以识别出这是一种排序关系,并以排序deredset的相同方式进行排序。我无法做到这一点。简单地说放,我认为用orderedSet做NSFRC是不可行的。我删除了我的NSFRC,并用我自己的方法处理了所有事情。我用这段代码做了一个测试项目,它工作了。我想知道我们做了什么不同。是的,但是当位置发生变化时,你计划更新每一个自对象吗?我不必更新每一个问题。只是受位置影响的项目内部会发生变化。每次在数组的索引处插入项时都会发生这种情况。因此,除非在每个项目中经常对问题进行重新排序,否则我看不出有什么大问题。我使用的项目是不断地重新排序(拖放功能).所以这不起作用。真遗憾。我觉得这不可能。现在就向苹果公司提交一个bug。