为啥 NSArrayController 在插入对象后“失去”排序?
Posted
技术标签:
【中文标题】为啥 NSArrayController 在插入对象后“失去”排序?【英文标题】:Why is an NSArrayController "losing" its sort after an object is inserted?为什么 NSArrayController 在插入对象后“失去”排序? 【发布时间】:2011-08-04 00:01:21 【问题描述】:我有一个 NSArrayController 绑定到 NSManagedObject 子类的属性。子类由 mogenerator 自动生成(它为关系创建一个集合属性)。
NSArrayController 绑定到 network.posts,其中 'posts' 是 1-M 关系。请注意,我绑定的是“posts”,而不是 mogenerator 生成的“postsSet”mutableSet 访问器。
该集合表示与另一个实体的关系。数组控制器有一个排序描述符集,当与之关联的窗口打开时,数据会以正确的排序顺序显示。
然后我通过实例化一个实体然后将其添加到关系中来添加一个新对象。
NSArrayController 正确地观察到这一变化,新对象出现在 arrangedObjects 中,然而,在插入之后,arrangedObjects 的排序顺序丢失并且记录以不同的顺序出现。
我已验证排序描述符仍然设置正确。 NSArrayController 有 autoRearrangeContent=YES。我什至尝试在插入后手动调用 -rearrangeObjects 但排序顺序仍然错误。
如果我关闭窗口并重新打开新实例化的 NSArrayController 再次具有正确排序顺序的数据。直到我再次插入。
我的经验是 NSArrayController 在添加/删除对象时会自动保持正确的排序顺序,但也许这是一个幸运的巧合?
我在 Apple 文档中找不到任何关于正确行为的描述,所以我不知道会发生什么,可能出了什么问题(如果有的话),或者 - 在任何一种情况下 - 我应该怎么做.
1) 给定一个 sortDescriptor,NSArrayController 是否应该在从底层集合中插入/删除对象后保持排列对象的排序?
2) 如果是这样,什么可以防止这种情况发生?
3) 如果不是,那么保持排列对象排序的正确方法是什么?
如果有任何帮助,我将不胜感激。在这种情况下提供有用的源代码并不容易,因为原则上没有任何源代码。但我很乐意澄清并回答任何后续问题。
【问题讨论】:
如果使用数组控制器的方法添加对象而不是依赖观察会发生什么? 【参考方案1】:关闭延迟获取。不确定原因,但是当控制器变得懒惰时,它不会在编辑或添加内容时采取措施。
【讨论】:
迈克非常感谢你。这看起来是个问题!真是一种解脱:)【参考方案2】:你按什么排序?核心数据不支持有序集合。要保留任何类型的顺序,您必须添加一些 sort 属性(双关语)并按其排序。
在幕后,CD 使用 NSSet/NSMutableSet - 而不是 NSArray/NSMutableArray - 用于集合。您的对象不止一次以相同的顺序出现完全是由于缓存,而不是由 CD 维护您的集合的顺序。
Lion (10.7) 更新
关于我的“不支持有序集合”声明:如果您在应用程序中以 10.7 及更高版本为目标,[NSManagedObject 现在为您提供有序关系。][1] 使用 -mutableOrderedSetValueForKey: 和 -mutableOrderedSetValueForKey: 来设置并检索 NSOrderedSets。耶!
【讨论】:
“数组控制器有一个排序描述符集……” 正如我提到的,有一个排序描述符设置为对对象属性之一进行排序,并且最初,数据以正确的顺序排序。我还验证了在插入之后仍然应用了排序描述符(并且它是相同的)。我还编辑了描述,因为我忘了提到我的 NSManagedObject 子类是由 mogenerator 生成的。 您可能想要发布生成的代码。您描述的行为并没有强烈表明某些事情没有按应有的方式工作。 :-) 你好约书亚。你指的是mogenerator生成的代码吗? 是的。我已经阅读了您的帖子几次,并不太明白问题出在哪里。除非我反复遗漏某些东西(一种明显的可能性),否则这应该可行。【参考方案3】:也许不是将 NSArrayController 绑定到您的 attributesSet
(由 mogenerator 生成),而是应该绑定到由 Core Data 框架创建的底层动态 attributes
属性本身? attributes
代表你的关系名称。
【讨论】:
谢谢。我已经回去编辑了这个问题,因为在我检查出来之后,我实际上是绑定到“posts”而不是 mogenerator 提供的“postsSet”可变访问器。以上是关于为啥 NSArrayController 在插入对象后“失去”排序?的主要内容,如果未能解决你的问题,请参考以下文章
NSArrayController 如何对一对多关系进行排序?
对支持 CoreData 的 NSArrayController 进行排序时遇到问题
tableCellView 内的 NSButton:如何对基于视图的 NSTableView/NSArrayController 使用“动作调用”
NSArrayController 和 Core Data 的行为不符合预期