我有7个表视图,每天一个。我将课程模型(名称,starTime,结束时间等)添加到日表中,并保存到核心数据中。我的NSFetchedResultsControlller子类每天有7个实例。 它基于每个表上的startTime对条目进行排序。我的应用程式0.0、0.1一切正常。我在0.1、0.1.1之间进行了轻量级迁移。这仅意味着添加一个称为“ notes(String)”的新属性。 迁移看起来很成功。没有崩溃,一切似乎都正常。 问题: 直到最近我才意识到,当我添加带有startTime的新条目时,我的fetchedResultsController并不计入旧的现有条目。 例如,我有一个两周前的旧列表((可能来自上一次应用更新之前):
- xy 14:00
- yy 14:30
- zz 18:00
- xyz 19:00
当我向列表中添加新条目时,无论它是否具有10:00 startTime,它都会添加到该行的末尾:
- xy 14:00
- yy 14:30
- zz 18:00
- xyz 19:00
- 新10:00
但是,当我继续添加新条目时,它们会在新条目中排序。让我们在9:00之前添加一个条目,结果是:
- xy 14:00
- yy 14:30
- zz 18:00
- xyz 19:00
- 最新9:00
- 新10:00
因此,排序在新条目之间进行。 更有趣的是,旧条目之间也可以进行排序,因此,例如,如果我更改旧条目,则可以。 yy为13:00,结果为:
- yy 13:30
- xy 14:00
- zz 18:00
- xyz 19:00
- 最新9:00
- 新10: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
}()