swift - 我获取的结果 Controller 未在旧条目中对新条目进行排序

标签 swift core-data uikit nsfetchedresultscontroller core-data-migration

我有 7 个表格 View ,每天一个。我将带有名称、starTime、endtime 等的类(class)模型添加到日期表中,并保存到核心数据中。我的 NSFetchedResultsControlller 子类每天有 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: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
       }()

最佳答案

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

关于swift - 我获取的结果 Controller 未在旧条目中对新条目进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983856/

相关文章:

swift - 第一次从 API 服务器获取结果显示 405 服务器错误,第二次工作正常

ios - 如何在 swift 中以编程方式设置 UIVisualEffectView 的活力值?

iphone - 在多个选项卡中使用相同的 NSManagedObjectContext

ios - 如何在 swift 4 中更改 NavBar 标题文本颜色?

objective-c - 如何将Scrollview滚动到边界之外

swift - 如何使用元组计算子字符串(单词)在字符串中出现的次数

ios - WKWebView 未填充容器 View

cocoa - 可以将 CoreData 与 iCloud 同步吗?

objective-c - 核心数据集属性

ios - 如何让 TableView 中的 SearchBar 看起来像设置应用程序中的搜索栏