Swift My Fetched Results Controller没有在旧条目中对新条目进行排序

Swift My Fetched Results Controller没有在旧条目中对新条目进行排序,swift,core-data,uikit,nsfetchedresultscontroller,core-data-migration,Swift,Core Data,Uikit,Nsfetchedresultscontroller,Core Data Migration,我有7个桌面视图,每天一个。我将带有名称、开始时间、结束时间等的课程模型添加到日表中,并保存到核心数据中。我的nsFetchedResultsController子类每天有7个实例。 它根据每个表上的开始时间对条目进行排序。在我的应用程序0.0、0.1上,一切正常。我在0.1和0.1.1之间进行了轻量级迁移。这只意味着添加一个名为“notes(String)”的新属性。 移民看起来很成功。没有发生什么事故,一切似乎都正常。 问题: 直到最近我才意识到,当我使用startTime添加一个新条目时,

我有7个桌面视图,每天一个。我将带有名称、开始时间、结束时间等的课程模型添加到日表中,并保存到核心数据中。我的nsFetchedResultsController子类每天有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点
  • 新的10:00
因此,在新条目之间进行排序。 更有趣的是,排序也在旧条目之间工作,因此如果我更改旧条目,例如ex.yy为13:00,结果是:

  • yy 13:30
  • xy 14:00
  • zz 18:00
  • xyz 19:00
  • 最晚9点
  • 新的10:00
但这里仍然没有考虑新的问题

有人知道这是什么原因吗?也许是因为我的轻量级迁移?我认为在每次更新时重新加载他们的表是一种非常糟糕的用户体验。 谢谢大家花时间

更新:

这可能是因为我的条目设置了一个绝对日期时间,但我只想设置一个相对时间,因为我的应用程序是一种类时间表工具。也许真正的问题是,如何使它独立于实际日期

我的财务报告准则:

  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)
                }
      }
}

这是我发现的。 我使用startTime属性保存模型对象,如9:00,但实际上整个当前日期与年、月、日一起保存。控制台清楚地显示了这一点。那不是我想要的

以下是修复方法:

我添加了一个新的DateComponents()变量。我将其年、月、日设置为2001.01.01。然后我让我的约会选择者设定时间,分钟

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()

事实上,我不知道怎么做,因为我正在使用日期选择器来设置时间。日期选择器有一个日期,即使他们没有显示它。
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()