2015-08-15 93 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更改。