我获取的结果控制器未在旧条目中对较新条目进行排序
My Fetched Results Controller Is Not sorting newer entries among the old entries
我有 7 次 table 观看次数,每天一次。我将带有名称、开始时间、结束时间等的课程模型添加到 table 天,保存到核心数据中。我的 NSFetchedResultsControlller subclass 每天有 7 个实例。
它根据每个 table 上的 startTime 对条目进行排序。我的应用程序的 0.0、0.1 一切正常。我在 0.1、0.1.1 之间进行了轻量级迁移。这仅意味着添加一个名为 "notes (String)" 的新 属性。
迁移看起来很成功。没有什么崩溃,一切似乎都正常。
问题:
直到最近我才意识到,当我添加一个带有 startTime 的新条目时,我的 fetchedResultsController 不计入旧的现有条目。
例如,我有一个两周前的旧列表,(- 可能是在上次应用程序更新之前):
- xy 14:00
- yy 14:30
- zz 18:00
- xyz19:00
当我向列表中添加新条目时,不管它是否具有 10:00 startTime,它都会添加到行尾:
- xy 14:00
- yy 14:30
- zz 18:00
- xyz19:00
- 新10:00
但是,当我不断添加新条目时,它们会在新条目中排序。让我们用 9:00 添加一个条目,会发生什么:
- xy 14:00
- yy 14:30
- zz 18:00
- xyz19:00
- 最新9:00
- 新10:00
所以排序在新条目中起作用。
更有趣的是,排序也在旧条目中起作用,所以如果我更改旧条目,例如。 yy 有13:00,结果是:
- yy 13:30
- xy 14:00
- zz 18:00
- xyz19:00
- 最新9:00
- 新10:00
但这里仍然不考虑新的。
任何人都知道什么会导致这种情况?可能是关于我的轻量级迁移?我认为每次更新到来时重新加载他们的 table 将是非常糟糕的用户体验。
感谢大家的抽空!
更新:
这可能是因为我的条目设置了绝对日期时间,但我只想设置一个相对时间,因为我的应用程序是一种 class 时间 table 的工具。也许真正的问题是,如何让它独立于实际日期?
我的 FRC:
import CoreData
class DayFetchedResultsController: NSFetchedResultsController<Lesson> {
override init(fetchRequest: NSFetchRequest<Lesson> = Lesson.fetchRequest(), managedObjectContext context: NSManagedObjectContext = CoreDataManager.shared.persistentContainer.viewContext, sectionNameKeyPath: String? = nil , cacheName name: String? = nil) {
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "startTime", ascending: true)]
super.init(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: sectionNameKeyPath, cacheName: name)
}
func setDayPredicate(_ formatString:String = "dayNumber = %i", day: Int ) {
let predicate = NSPredicate(format: formatString, day)
self.fetchRequest.predicate = predicate
}
func fetch(day: Int) {
setDayPredicate("dayNumber = %i", day: day)
do {
try self.performFetch()
} catch let fetchErr {
print("Failed to fetch results", fetchErr)
}
}
}
在我的主 VC:
lazy var mondayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 0)
frc.delegate = self
return frc
}()
lazy var tuesdayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 1)
frc.delegate = self
return frc
}()
lazy var wednesdayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 2)
frc.delegate = self
return frc
}()
lazy var thursdayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 3)
frc.delegate = self
return frc
}()
lazy var fridayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 4)
frc.delegate = self
return frc
}()
lazy var saturdayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 5)
frc.delegate = self
return frc
}()
lazy var sundayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 6)
frc.delegate = self
return frc
}()
以下是我的发现。
我用 startTime 属性 来保存我的模型对象,例如 9:00,但实际上整个当前日期与年、月、日一起保存。控制台清楚地显示了这一点。那不是我想要的。
修复方法如下:
我添加了一个新的 DateComponents() 变量。我将它的年、月、日设置为 2001.01.01。然后我让我的 datePicker 设置小时、分钟。
var dateComponents: DateComponents = {
var dc = DateComponents()
dc.year = 2001
dc.month = 1
dc.day = 1
return dc
}()
dateComponents.hour = formatter.calendar.component(.hour, from: datePicker.date)
dateComponents.minute = formatter.calendar.component(.minute, from: datePicker.date)
startTime = formatter.calendar.date(from: dateComponents) ?? Date()
我有 7 次 table 观看次数,每天一次。我将带有名称、开始时间、结束时间等的课程模型添加到 table 天,保存到核心数据中。我的 NSFetchedResultsControlller subclass 每天有 7 个实例。 它根据每个 table 上的 startTime 对条目进行排序。我的应用程序的 0.0、0.1 一切正常。我在 0.1、0.1.1 之间进行了轻量级迁移。这仅意味着添加一个名为 "notes (String)" 的新 属性。 迁移看起来很成功。没有什么崩溃,一切似乎都正常。 问题: 直到最近我才意识到,当我添加一个带有 startTime 的新条目时,我的 fetchedResultsController 不计入旧的现有条目。 例如,我有一个两周前的旧列表,(- 可能是在上次应用程序更新之前):
- xy 14:00
- yy 14:30
- zz 18:00
- xyz19:00
当我向列表中添加新条目时,不管它是否具有 10:00 startTime,它都会添加到行尾:
- xy 14:00
- yy 14:30
- zz 18:00
- xyz19:00
- 新10:00
但是,当我不断添加新条目时,它们会在新条目中排序。让我们用 9:00 添加一个条目,会发生什么:
- xy 14:00
- yy 14:30
- zz 18:00
- xyz19:00
- 最新9:00
- 新10:00
所以排序在新条目中起作用。 更有趣的是,排序也在旧条目中起作用,所以如果我更改旧条目,例如。 yy 有13:00,结果是:
- yy 13:30
- xy 14:00
- zz 18:00
- xyz19:00
- 最新9:00
- 新10:00
但这里仍然不考虑新的。
任何人都知道什么会导致这种情况?可能是关于我的轻量级迁移?我认为每次更新到来时重新加载他们的 table 将是非常糟糕的用户体验。 感谢大家的抽空!
更新:
这可能是因为我的条目设置了绝对日期时间,但我只想设置一个相对时间,因为我的应用程序是一种 class 时间 table 的工具。也许真正的问题是,如何让它独立于实际日期?
我的 FRC:
import CoreData
class DayFetchedResultsController: NSFetchedResultsController<Lesson> {
override init(fetchRequest: NSFetchRequest<Lesson> = Lesson.fetchRequest(), managedObjectContext context: NSManagedObjectContext = CoreDataManager.shared.persistentContainer.viewContext, sectionNameKeyPath: String? = nil , cacheName name: String? = nil) {
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "startTime", ascending: true)]
super.init(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: sectionNameKeyPath, cacheName: name)
}
func setDayPredicate(_ formatString:String = "dayNumber = %i", day: Int ) {
let predicate = NSPredicate(format: formatString, day)
self.fetchRequest.predicate = predicate
}
func fetch(day: Int) {
setDayPredicate("dayNumber = %i", day: day)
do {
try self.performFetch()
} catch let fetchErr {
print("Failed to fetch results", fetchErr)
}
}
}
在我的主 VC:
lazy var mondayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 0)
frc.delegate = self
return frc
}()
lazy var tuesdayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 1)
frc.delegate = self
return frc
}()
lazy var wednesdayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 2)
frc.delegate = self
return frc
}()
lazy var thursdayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 3)
frc.delegate = self
return frc
}()
lazy var fridayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 4)
frc.delegate = self
return frc
}()
lazy var saturdayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 5)
frc.delegate = self
return frc
}()
lazy var sundayFetchedResultsController: DayFetchedResultsController = {
let frc = DayFetchedResultsController()
frc.fetch(day: 6)
frc.delegate = self
return frc
}()
以下是我的发现。 我用 startTime 属性 来保存我的模型对象,例如 9:00,但实际上整个当前日期与年、月、日一起保存。控制台清楚地显示了这一点。那不是我想要的。
修复方法如下:
我添加了一个新的 DateComponents() 变量。我将它的年、月、日设置为 2001.01.01。然后我让我的 datePicker 设置小时、分钟。
var dateComponents: DateComponents = {
var dc = DateComponents()
dc.year = 2001
dc.month = 1
dc.day = 1
return dc
}()
dateComponents.hour = formatter.calendar.component(.hour, from: datePicker.date)
dateComponents.minute = formatter.calendar.component(.minute, from: datePicker.date)
startTime = formatter.calendar.date(from: dateComponents) ?? Date()