gpt4 book ai didi

ios - TableView 部分更新取决于 CoreData transient 属性更改

转载 作者:行者123 更新时间:2023-12-01 16:30:16 25 4
gpt4 key购买 nike

我正在尝试开发一个时间表应用程序。

我有 TableViewController 显示当天的类(class)。在 viewDidLoad() 中,我使用 NSFetchedResultsController 获取类:

let fetchRequest = NSFetchRequest(entityName: "Lessons")
let predicate = NSPredicate(format: "startsday = '\(dateFormatter.stringFromDate(NSDate()))'", NSDate())
fetchRequest.predicate = predicate
let sortDescriptorStarts = NSSortDescriptor(key: "starts", ascending: true)
let sortDescriptorTitle = NSSortDescriptor(key: "title", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptorStarts, sortDescriptorTitle]
fetchRequest.fetchBatchSize = 30
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: "sectionIdentifier", cacheName: nil)
fetchedResultsController.delegate = self
fetchedResultsController.performFetch(nil)

当我设置 sectionNameKeyPath: "sectionIdentifier"(这是一个 transient 属性)时,它们根据当前时间分为三组“过去”、“现在”、“下一个”。这是工作。我有一个 screenshot这里。

我的问题是: 随着时间的推移,这些部分不会更新
这些行应该移出并移入其他部分,最终它们都应该进入“过去”部分,并且应该删除“现在”、“下一个”部分。

我可以更新 sectionIdentifier transient 属性,但我的 fetchedResultController 不想注意到这些变化......

我不想使用 tableView.reloadData() 因为我想要动画。

(有一个 similar 问题,但它的结尾不同。我无法得到答案。)

谢谢!

最佳答案

我已经找到了解决这个问题的方法。它绝对不是最好的,但运行良好。 ( swift 2.3)

首先,我有一个名为“sectionIdentifier”的 transient 属性。这可能是“NOW”、“NEXT”和“PAST”,具体取决于当前时间。我在这个 transient 旁边添加了一个名为“sectionID”的新持久属性。该属性的目的是判断类(class)状态(现在、下一个、过去)是否发生了变化。我将原始获取更改为:

let fetchRequest = NSFetchRequest(entityName: "Lessons")
let predicate = NSPredicate(format: "startsday = '\(dateFormatter.stringFromDate(NSDate()))'", NSDate())
fetchRequest.predicate = predicate
let sortDescriptorStarts = NSSortDescriptor(key: "starts", ascending: true)
let sortDescriptorTitle = NSSortDescriptor(key: "title", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptorStarts, sortDescriptorTitle]
fetchRequest.fetchBatchSize = 30
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: "sectionIdentifier", cacheName: nil)
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch _ {
//Handle error
}
if let lessons = fetchedResultsController.fetchedObjects as? [Lessons] {
for lesson in lessons {
if lesson.sectionID != lesson.sectionIdentifier! {
lesson.setValue(lesson.sectionIdentifier!, forKey: "sectionID")
moc.refreshObject(lesson, mergeChanges: true)
}
}
}

在获取之后,我将此持久属性设置为 transient 的值。 (上面最后 8 行)

在 viewDidLoad() 我添加了这一行。
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(TodayViewController.update), userInfo: nil, repeats: true)

我每秒更新我的 transient 属性。
我的更新方法如下所示:
func update() {
for lesson in fetchedResultsController.fetchedObjects as! [Lessons] {
if lesson.sectionID != lesson.sectionIdentifier! {
lesson.setValue(lesson.sectionIdentifier!, forKey: "sectionID")
moc.refreshObject(lesson, mergeChanges: true)
do {
try moc.save()
}
catch _ {
//Handle error
}
}
}
}

因此,我的 transient 属性将始终提供类(class)当前状态,而持久属性将始终提供 tableviewcell 的状态。如果有差异,我将我的 transient 值放入持久属性中,并使用 moc.refreshobject() 我将获得正确的 FetchedResultControllerDelegate 方法,并且我可以在那里处理 tableview 更改。

关于ios - TableView 部分更新取决于 CoreData transient 属性更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32028318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com