我获取的结果控制器未在旧条目中对较新条目进行排序

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 不计入旧的现有条目。 例如,我有一个两周前的旧列表,(- 可能是在上次应用程序更新之前):

当我向列表中添加新条目时,不管它是否具有 10:00 startTime,它都会添加到行尾:

但是,当我不断添加新条目时,它们会在新条目中排序。让我们用 9:00 添加一个条目,会发生什么:

所以排序在新条目中起作用。 更有趣的是,排序也在旧条目中起作用,所以如果我更改旧条目,例如。 yy 有13: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()