gpt4 book ai didi

ios - 带有 NSFetchedResultsController 的 UITableView : Sort each section independently of each other

转载 作者:行者123 更新时间:2023-12-01 19:05:54 27 4
gpt4 key购买 nike

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

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

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

  • 所以这是我现在获取结果时的代码:
    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。 这样,您可以为每个部分使用不同的搜索描述符。这会将一些模型细节与您的 Controller 联系起来,这意味着如果您计划创建一个新的状态类型,您将需要修改您的 Controller 以及您的模型。

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

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

    方法二:在您的模型中添加一个特殊字段以用作排序字段,然后自动更新该字段以保持您喜欢的排序顺序。 例如,对于状态为"new"的订单,您只需将订单日期存储在此字段中。对于具有“已接受”状态的订单,您存储交货日期。对于具有“已交付”状态的订单,您希望存储订单日期,但您希望它处于相反的方向。实现这种反转的最简单方法是存储订单日期乘以 -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 实体实现一个自定义类来保持这个特殊的排序字段是最新的,并为订单状态和所涉及的日期编写自定义 setter 以在字段时更改此字段取决于变化。

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

    关于ios - 带有 NSFetchedResultsController 的 UITableView : Sort each section independently of each other,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19695912/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com