我有 7 个表格 View ,每天一个。我将带有名称、starTime、endtime 等的类(class)模型添加到日期表中,并保存到核心数据中。我的 NSFetchedResultsControlller 子类每天有 7 个实例。 它根据每个表的开始时间对条目进行排序。我的应用程序 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,它都会添加到行尾:
- 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
}()
最佳答案
这是我所发现的。 我使用 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()
关于swift - 我获取的结果 Controller 未在旧条目中对新条目进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983856/