我的访存结果控制器未在旧条目中对新条目进行排序

我有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
       }()
buguizebinggan 回答:我的访存结果控制器未在旧条目中对新条目进行排序

这就是我所发现的。 我正在使用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()
本文链接:https://www.f2er.com/3054755.html

大家都在问