我有7个表视图,每天一个。我将课程模型(名称,starTime,结束时间等)添加到日表中,并保存到核心数据中。我的NSFetchedResultsControlller子类每天有7个实例。它基于每个表上的startTime对条目进行排序。我的应用程式0.0、0.1一切正常。我在0.1、0.1.1之间进行了轻量级迁移。这仅意味着添加一个称为“ notes(String)”的新属性。迁移看起来很成功。没有崩溃,一切似乎都正常。问题:直到最近我才意识到,当我添加带有startTime的新条目时,我的fetchedResultsController并不计入旧的现有条目。例如,我有一个两周前的旧列表((可能来自上一次应用程序更新之前):
当我向列表中添加新条目时,不管它有10:00 startTime,它都会添加到该行的末尾:
但是,当我继续添加新条目时,它们会在新条目中排序。让我们添加一个与9:00对应的条目,结果是:
因此排序在新条目之间进行。更有趣的是,旧条目之间也可以进行排序,因此,例如,如果我更改旧条目,则可以。 yy为13:00,结果为:
但是这里不考虑新事物。
任何人都有一个想法会导致什么?也许是关于我的轻量级迁移?我认为每次更新即将到来时重新加载表将是非常糟糕的用户体验。感谢大家抽出宝贵的时间!
更新:
这可能是因为为我的条目设置了绝对日期时间,但是我只是想设置一个相对时间,因为我的应用程序是类时间表的一种工具。也许真正的问题是,如何使其与实际日期无关?
我的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)保存模型对象,但实际上,整个当前日期与年,月,日一起保存。控制台清楚地显示了这一点。那不是我想要的。我只想要一个每周重复上课的时间表,所以我只需要几个小时。我正在考虑一个非常简单的解决方法:将所有条目的日期设置为任意日期,例如1970.01.01,然后设置时间。