UITableView with NSFetchedResultsController:对每个部分进行独立排序



我正在开发一个核心数据应用程序。我有一个主表,显示具有不同状态的订单:新订单、已接受订单、已交付订单等。

我遇到的问题是我需要按不同的标准对每个部分进行排序。例如:

  • 新订单需要按顶部最旧的顺序排序。
  • 接受的订单需要按最快方式排序才能在顶部交付。
  • 已交付的订单需要按顶部的最新顺序排序。

所以这是我在获取结果时现在拥有的代码:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"CDOrder"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"orderPosition" ascending:YES],[NSSortDescriptor sortDescriptorWithKey:@"createdDate" ascending:NO]];  
User* user = [User getInstance];
NSDate *TwelveHoursAgo = [NSDate dateWithTimeIntervalSinceNow:-3600 * 12];
request.predicate = [NSPredicate predicateWithFormat:@"(servicePersonId == %@) AND (createdDate >= %@)", [NSNumber numberWithLong:user.userId], TwelveHoursAgo];
ordersTableViewController.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:super.managedObjectContext sectionNameKeyPath:@"orderPosition" cacheName:nil];

如您所见,这是根据"orderPosition"制作部分并按"createdDate"对所有订单进行排序。但是我需要按"deliverDate"订购某些订单

谢谢

我可以想到两种解决此问题的方法。

方法一:为每个部分使用单独的NSFetchedResultsController。这样,您可以为每个部分使用不同的搜索描述符。这会将一些模型详细信息与控制器相关联,这意味着如果您计划创建新的状态类型,则需要修改控制器和模型。

实现这一点的最简单方法是创建不同NSFetchedResultsControllers的数组。数组中的项数是节数。但请注意,这样做可能会导致表视图中出现空部分。例如,如果没有任何已接受的订单,您可能仍会在UITableView中看到"已接受的订单"部分。

在某个时候,这可能会变得足够复杂,以至于需要将此代码放入其自己的自定义结果控制器中,该控制器在内部管理NSFetchedResultsController的列表,并公开与NSFetchedResultsController相似或相同的外部接口。

方法二:为您的模型添加一个特殊字段以用作排序字段,然后自动更新该字段以保持您喜欢的排序顺序。例如,对于状态为"新"的订单,您只需将订单日期存储在此字段中即可。对于状态为"已接受"的订单,您需要存储交货日期。对于状态为"已送达"的订单,您希望存储订单日期,但希望其方向相反。按顺序实现此反转的最简单方法是存储订单日期乘以 -1。

NSDate 只是一个简单的基元的包装器,它存储表示的日期和 2001 年 1 月 1 日之间的时间间隔。您可以使用以下代码轻松地将该数字乘以 -1:

float interval = [orderDate timeIntervalSinceReferenceDate];
NSDate *reversedDate = [NSDate dateWithTimeIntervalSinceReferenceDate:(interval * -1)];

使用上面的代码,订单日期 2013-10-31 02:03:20 导致反向日期 1988-03-03 21:56:48。

您需要通过为 Order 实体实现自定义类(如果尚未这样做)来使此特殊排序字段保持最新,并为订单状态和所涉及的日期编写自定义资源库,以便在它所依赖的字段发生变化时更改此字段。

第二种方法似乎很糟糕,需要非规范化,但可能是更好的解决方案,具体取决于您的应用程序以及您期望该应用程序将来如何更改。

最新更新