1

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

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

  • 新订单需要按最旧的排序。
  • 接受的订单需要按最快的时间排序才能在顶部交付。
  • 交付的订单需要按最新排序。

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

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"

谢谢

4

1 回答 1

3

我可以想出两种方法来解决这个问题。

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

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

在某些时候,这可能会变得足够复杂,以至于需要将此代码放入其自己的自定义结果控制器中,该控制器在内部管理 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 实体实现一个自定义类来保持这个特殊的排序字段是最新的,并为订单状态和所涉及的日期编写自定义设置器以在字段时更改此字段取决于变化。

第二种方法看起来很自以为是并且需要非规范化,但可能是更好的解决方案,具体取决于您的应用程序以及您期望该应用程序在未来如何变化。

于 2013-10-31T02:14:54.840 回答