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 方法,我可以在那里处理表视图更改。