使用 NSFetchedResultsController 按日期将 CoreData 模型排列成部分[重复]

Posted

技术标签:

【中文标题】使用 NSFetchedResultsController 按日期将 CoreData 模型排列成部分[重复]【英文标题】:use NSFetchedResultsController to arrange CoreData model into sections by date [duplicate] 【发布时间】:2018-05-15 04:18:06 【问题描述】:

我目前正在使用 CoreData 对我的模型进行本地存储。我已经成功实现了一个 NSfetchedResultsController 来管理 tableView 中数据的检索和呈现。

我希望数据按当地日期按部分组织。因此,每个部分都将是当地独特的一天。与大多数聊天应用类似。

我知道除了时间戳之外,我还可以在 managedObject 中保存一个日期属性并将其用作 sectionNameKeyPath,但是当用户更改其设备上的时区时,这将不起作用。在这种情况下,我将不得不返回并更改 coreData 中的每个条目并更改本地日期条目。

考虑到时区变化的可能性,有没有更简单的方法来实现按天组织?

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Blog")
let blogSort = NSSortDescriptor(key: "dateCreated", ascending: true)
request.sortDescriptors = [blogSort]
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: "localDate", cacheName: nil)

在本例中,dateCreated 是博客创建日期的时间戳,localDate 是实际日历日期。

【问题讨论】:

如何将localDate 属性保存到模型中? 使用 Calendar.current 将时间戳转换为日期字符串并保存为字符串 你试过DateFormatter 我认为从我所读到的答案是在 coredata 中使用瞬态属性。只是不知道如何使用 swift 4 来实现它 看看***.com/a/30544650/1187415,它演示了如何定义一个瞬态属性sectionIdentifier,它可以用作获取结果控制器的sectionNameKeyPath 【参考方案1】:

这不是您问题的答案。但我认为这对你有帮助。

let date = Date.init()
let dateFormatter = DateFormatter.init()
dateFormatter.dateStyle = .short
let stringDate = dateFormatter(stringFrom: date)

然后您可以将此字符串作为localDate 保存到managedObject

managedObject.localDate = stringDate

【讨论】:

我知道该怎么做。这将始终按本地日期对部分进行分组。但是,如果用户随后去了欧洲并且手机上的时区发生了变化,那么您的日期字符串将是他们离开的任何地方的本地日期,并且这些部分看起来不正确。答案必须在 coreData 上的瞬态属性和许多目标 C 和较旧的 swift 示例中,但没有当前示例。 我还没有测试!但我认为这是可能的。因此,将localDate 作为Date.init() 保存到模型中。并在从模型中检索时将此值转换为 Calender.current【参考方案2】:

我会为此使用Blog 类中的计算属性。这就是我的处理方式

    使用 ISO8601DateFormatter 以相同的时区(GMT 最简单)保存创建日期 向 Blog 实体添加一个临时属性,例如 localCreateDate: Date,并通过使用本地时区将存储的创建日期解析为 Date 实例来计算它 在提取控制器中使用新的localCreateDate 作为sectionNameKeyPath,参见this answer 或this by Martin R

【讨论】:

您不能在 Core Data 排序描述符中使用计算属性。 @MartinR,你是对的。我在考虑一个瞬态属性。 您也不能在 Core Data 排序描述符中使用瞬态属性。但是,您可以将它们用作 sectionNameKeyPath,这就是我试图在 ***.com/a/30544650/1187415 中演示的内容。 哎呀,我今天真的很粗心。我一直在关注my own answer,但我还是搞错了。 @MartinR,感谢您的意见。

以上是关于使用 NSFetchedResultsController 按日期将 CoreData 模型排列成部分[重复]的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存竞争条件错误

在 Swift 3 中难以配置 NSFetchedResultsController

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?