在使用核心数据的 tableview 中实现任意行重新排序的最佳方法是什么?对我来说似乎很明显的方法是将 Int16 类型的 rowOrder 属性添加到 tableview 中正在重新排序的实体,并在用户完成重新排序时手动迭代更新所有行的 rowOrder 属性的实体。
不过,这是一个非常不雅的解决方案。我希望有一种更好的方法,只要用户重新订购东西,就不需要数百次更新。
如果排序是数据模型应该模态和存储的东西,那么排序应该是实体图的一部分。
一个好的、轻量级的解决方案是创建一个Order
与实际订购的实体具有一对一关系的实体。为了使更新更容易,请创建一个类似于对象结构的链表。像这样的东西:
Order{
order:int;
orderedObject<--(required,nullify)-->OrderObject.order
previous<--(optional,nullify)-->Order.next;
next<--(optional,nullify)-->Order.previous;
}
如果您创建一个自定义子类,您可以提供一个insert
方法,在链中插入一个新对象,然后向next
关系发送消息,并告诉每个对象将其顺序递增一个,然后将消息添加到下一个。一种delete
方法则相反。这使得排序成为模型的组成部分并且被很好地封装。为此创建一个基类很容易,因此您可以根据需要重用它。
最大的优点是它只需要小Order
对象在内存中存活。
当然,您可以使用另一个链接对象来扩展它以提供部分信息。只需将该实体与Order
实体相关联,然后提供订单号作为该部分中的订单号。
没有更好的方法,这是公认的解决方案。Core Data 内部没有行排序,所以你需要自己做。然而,它真的不是很多代码。