【问题标题】:NSFetchRequest predicate to sort by Date, using time component onlyNSFetchRequest 谓词按日期排序,仅使用时间组件
【发布时间】:2020-04-23 10:12:55
【问题描述】:

想想 iPhone 上的闹钟应用程序,闹钟按时间排序。假设这些警报存储在 Core Data 中,日期组件是它们创建的实际日期,但时间组件由日期选择器选择。因此,在获取这些时,您需要忽略日期组件并仅按时间对它们进行排序。

如果所有警报都在同一日期创建,则此方法有效:

fetchRequest.sortDescriptors = [NSSortDescriptor(key: date, ascending: true)]

但是,如果它们是在不同的日期创建的,显然首先创建的会按日期列出,并按每个日期组内的时间排序。我想在进行这种排序时完全忽略日期组件,并仅按时间组件对所有内容进行排序。

【问题讨论】:

    标签: swift core-data nsdate nspredicate nsfetchrequest


    【解决方案1】:
    • 在 NSManagedObject 子类中创建一个全局日期格式化程序

      let timeFormatter : DateFormatter = {
          let formatter = DateFormatter()
          formatter.locale = Locale(identifier: "en_US_POSIX")
          formatter.dateFormat = "HH:mm:ss"
          return formatter
      }()
      
    • 和一个计算属性

      @objc var time : String {
          return timeFormatter.string(from: date)
      }
      
    • 然后获取未排序的记录并手动对它们进行排序

      let sortedRecords = records.sorted{ $0.time < $1.time }
      

    【讨论】:

    • 好主意!我想我错过了一些东西:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath time not found in entity &lt;NSSQLEntity MyEntity id=3&gt;' 我还需要在模型编辑器中添加“时间”吗?
    • 谢谢。不过,我正在使用 NSFetchedResultsController ,这似乎没有机会对这样的记录进行排序。我将如何修改?
    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2019-07-15
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多