TableView 部分更新取决于 CoreData 瞬态 属性 变化
TableView section update depend on CoreData transient property change
我正在尝试开发一个时间表应用程序。
我有 TableViewController,它显示当天的 类。在 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"(这是一个瞬态 属性)时,它们被分为三组 "Past"、"Now"、"Next"取决于当前时间。这是工作。我这里有一个screenshot。
我的问题是:随着时间的推移,这些部分没有更新
行应该移出并移动到其他部分,最终它们应该都进入"Past"部分,并且应该删除"Now"、"Next"部分。
我可以更新 sectionIdentifier transient 属性,但我的 fetchedResultController 不想注意到这些变化...
我不想使用 tableView.reloadData( ) 因为我想要动画。
(有个similar问题,但是结局不一样,我答不出来。)
谢谢!
我找到了解决这个问题的方法。它绝对不是最好的,但它工作得很好。 (Swift2.3)
首先,我有一个名为 "sectionIdentifier" 的瞬变 属性。这可能是 "NOW"、"NEXT" 和 "PAST",具体取决于当前 [=30] =] 在这个名为 "sectionID" 的瞬态旁边添加了一个新的持久性 属性。 属性 的目的是判断课程状态(NOW、NEXT、PAST)是否改变。我将原来的提取更改为:
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)
}
}
}
获取后,我将此持久性 属性 设置为瞬态值。 (上面最后 8 行)
我在 viewDidLoad() 中添加了这一行。
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(TodayViewController.update), userInfo: nil, repeats: true)
我每秒更新一次 属性。
我的更新方法如下所示:
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
}
}
}
}
所以我的瞬态 属性 将始终提供课程当前状态,而持久性将始终提供 tableviewcell 的状态。如果有差异,我将瞬态值放入持久 属性 并使用 moc.refreshobject() 我将获得正确的 FetchedResultControllerDelegate 方法,我可以在那里处理表视图更改。
我正在尝试开发一个时间表应用程序。
我有 TableViewController,它显示当天的 类。在 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"(这是一个瞬态 属性)时,它们被分为三组 "Past"、"Now"、"Next"取决于当前时间。这是工作。我这里有一个screenshot。
我的问题是:随着时间的推移,这些部分没有更新
行应该移出并移动到其他部分,最终它们应该都进入"Past"部分,并且应该删除"Now"、"Next"部分。
我可以更新 sectionIdentifier transient 属性,但我的 fetchedResultController 不想注意到这些变化...
我不想使用 tableView.reloadData( ) 因为我想要动画。
(有个similar问题,但是结局不一样,我答不出来。)
谢谢!
我找到了解决这个问题的方法。它绝对不是最好的,但它工作得很好。 (Swift2.3)
首先,我有一个名为 "sectionIdentifier" 的瞬变 属性。这可能是 "NOW"、"NEXT" 和 "PAST",具体取决于当前 [=30] =] 在这个名为 "sectionID" 的瞬态旁边添加了一个新的持久性 属性。 属性 的目的是判断课程状态(NOW、NEXT、PAST)是否改变。我将原来的提取更改为:
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)
}
}
}
获取后,我将此持久性 属性 设置为瞬态值。 (上面最后 8 行)
我在 viewDidLoad() 中添加了这一行。
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(TodayViewController.update), userInfo: nil, repeats: true)
我每秒更新一次 属性。 我的更新方法如下所示:
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
}
}
}
}
所以我的瞬态 属性 将始终提供课程当前状态,而持久性将始终提供 tableviewcell 的状态。如果有差异,我将瞬态值放入持久 属性 并使用 moc.refreshobject() 我将获得正确的 FetchedResultControllerDelegate 方法,我可以在那里处理表视图更改。