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

Posted

技术标签:

【中文标题】我的 Fetched Results Controller 没有在旧条目中对新条目进行排序【英文标题】:My Fetched Results Controller Is Not sorting newer entries among the old entries 【发布时间】:2019-11-21 21:14:49 【问题描述】:

我有 7 个表格视图,每天一个。我将带有名称、starTime、endtime 等的课程模型添加到日表中,并保存到核心数据中。我的 NSFetchedResultsController 子类每天有 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 开始时间,它都会添加到行尾:

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

【问题讨论】:

【参考方案1】:

这是我发现的。 我正在使用 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()

【讨论】:

其实我不知道该怎么做,因为我使用 datePicker 来设置时间。 DatePickers 有一个日期,即使它们没有显示它。

以上是关于我的 Fetched Results Controller 没有在旧条目中对新条目进行排序的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能使用闭包创建 Fetched Results Controller?

使用 fetched 属性的核心数据跨存储查询

Core Data Fetched Properties 对对象之间的连接性进行排名

异步 JSON.stringify

即使交易正常,今天也出现多个 ACCOUNT_CANNOT_BE_FETCHED 错误

如何确保从上下文而不是缓存中获取 Core Data Fetched Property?