2015-08-15 72 views
2

我正在嘗試開發時間表應用程序。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」(這是一個短暫的財產),他們被分成三組「過去」,「現在」,「下一頁「取決於當前的時間。這是工作。我在這裏有一個screenshot

我的問題是:隨着時間的推移部分將無法更新
該行應該遷出,並在其他部分中移動,最終他們都應該進入「過去」部分,以及「現在「,」下一步「部分應該被刪除。

我可以更新sectionIdentifier瞬態特性,但我fetchedResultController不希望看到的變化...

我不想使用tableView.reloadData(),因爲我想要的動畫。

(有一個similar的問題,但它的結束是不同的。我不能讓我的答案。)

謝謝!

回答

0

我找到了解決這個問題的辦法。這絕對不是最好的,但它很好地工作。 (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行以上)

In 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更改。