您好,登錄后才能下訂單哦!
NSFetchedResultsController是為了讓視圖及時響應Model層的變化而設計的,更具體的將是配合刷新UITableView上的數據。
一般而言,NSFetchedResultsController的實例是由UITableViewController的實例初始化并持有。
創建后,我們將給它分配一個代理(NSFetchedResultsControllerDelegate),當Core Data中的model有變化時,通過代理通知到對應的tableView。
對象的新增:新增的對象無法關聯到fetchedResultsController,一般是通過 [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:managedObjectContext]的方式初始化并賦值,并保存( [managedObjectContext save:&error]),此處采用的是一致的managedObjectContext,會觸發NSFetchedResultsChangeInsert通知。
對象的更新:在某些需求中,對象可能是后臺異步得到json數據,然后同步進數據庫中的。直接對該對象更新,并保存( [managedObjectContext save:&error])。
對象的刪除:通過在一致的managedObjectContext上刪除對應的model對象,會觸發NSFetchedResultsChangeDelete通知。并且會將其相關的cascade關系的對象一起刪除,無需單獨操作。 [post.managedObjectContext deleteObject:post];
官方推薦的方式,是盡量在代理的didChangeObject方法中處理tableView上對section或者row的更新。不管對對象的操作是通過NSArray還是NSFetchedResultsController來獲取,亦或是通過insertNewObjectForEntityForName方法去新增,只要是在綁定到代理上的那個controller對象所包含的結果集內的對象有變化,都會觸發代理中的didChangeObject方法。
對于對象相關的關系對象變化,比如post對象有個owner對象關系,owner發生了變化,如果會影響結果集,同樣會觸發post的didChangeObject方法,反之則不會。
遇到最多的問題是相關的model有了更新,并在上下文保存了,但關聯的代理的didChangeObject方法中沒有被觸發,總結了一下,原因主要有幾個:
1. managedObejctContext不一致
2. 分析下fetch到controller對應的predicate是否包含受影響的該model,并檢查由于該model的相關屬性變化后,它對應在結果集中是新增/更新/刪除操作,那么在didChangeObject中就會觸發到相應的NSFetchedResultsChange
3. 當前返回的controller的delegate是否綁定到對應的代理上了
相關資料:
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。