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