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

问题描述 投票:0回答:1

我有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
       }()
swift core-data uikit nsfetchedresultscontroller core-data-migration
1个回答
0
投票

这就是我所发现的。我正在使用startTime属性(例如9:00)保存模型对象,但实际上,整个当前日期与年,月,日一起保存。控制台清楚地显示了这一点。那不是我想要的。我只想要一个每周重复上课的时间表,所以我只需要几个小时。我正在考虑一个非常简单的解决方法:将所有条目的日期设置为任意日期,例如1970.01.01,然后设置时间。

© www.soinside.com 2019 - 2024. All rights reserved.