TableView节更新依赖于CoreData的瞬态属性更改

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

我有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”(这是一个瞬态属性),他们被分为三组“过去”,“现在”,“下一步”取决于当前的时间。 这是工作。 我在这里有一个截图 。

我的问题是: 随着时间的推移,部分不会更新
行应该移出并移动到其他部分,最后它们应该全部进入“过去”部分,并且“现在”,“下一步”部分应该被删除。

我可以更新sectionIdentifier瞬态属性,但我fetchedResultController不希望注意到更改…

我不想使用tableView.reloadData(),因为我想animation。

(还有一个类似的问题,但结果是不同的,我不能得到我的答案。)

谢谢!

我find了解决这个问题的办法。 这绝对不是最好的,但它的工作很好。 (Swift 2.3)

首先,我有一个名为“sectionIdentifier”的瞬态属性,可以是“NOW”,“NEXT”和“PAST”取决于当前的时间。我在这个临时的“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方法,我可以处理在那里的tableview更改。