亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有謂詞的NSFetchedResultsController會忽略來自不同NSManaged

帶有謂詞的NSFetchedResultsController會忽略來自不同NSManaged

iOS
呼啦一陣風 2019-11-13 15:54:47
我正在展示使用NSFetchedResultsController謂詞的表視圖內容:[NSPredicate predicateWithFormat:@"visible == %@", [NSNumber numberWithBool:YES]]在使用單獨的后臺線程時,NSManagedObjectContext我更新了幾個實體,并將它們的visible值從更改NO為YES。保存,合并主線程中的更改NSManagedObjectContext。但是NSFetchedResultsControllers fetchedObjects不會改變??刂破饕膊粫{用-controller:didChangeObject:...委托。如果實體以相同的方式在主線程上更新(我的測試應用程序調用了相同的方法),那么一切都會按預期進行。通知還NSUpdatedObjectsKey包含那些對象。目前,我發現的唯一解決方案是調用每個NSUpdatedObjectsKey實體:NSManagedObjectContext *context = ... // main thread context[context existingObjectWithID:[object objectID] error:nil]此問題僅與以前與謂詞不匹配的更新對象有關。我是否缺少明顯的東西?
查看完整描述

3 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

事實證明,更新對象NSManagedObjectContext沒有主事件觸發NSManagedObjectContextObjectsDidChangeNotification,因為故障對象未完成觸發。


通用修復(或跟蹤需要此處理的對象ID):


NSManagedObjectContext *context = [self managedObjectContext];

for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) {

  [[context objectWithID:[object objectID]] willAccessValueForKey:nil];

}


[context mergeChangesFromContextDidSaveNotification:notification];

從NSManagedObject類參考:


您可以使用鍵值nil調用此方法,以確保已引發故障,如以下示例所示。


查看完整回答
反對 回復 2019-11-13
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

從另一個NSManagedObjectContext合并更改后,必須在Background-NSManagedObjectContext上調用processPendingChanges。


請參閱《 CoreData編程指南》:


請注意,更改通知是通過NSManagedObjectContext的processPendingChanges方法發送的。主線程與應用程序的事件周期綁定在一起,以便在主線程擁有的上下文中的每個用戶事件發生后,自動調用processPendingChanges。后臺線程不是這種情況-調用方法時取決于平臺和發行版,因此您不應依賴特定的時間。如果輔助上下文不在主線程上,則應在適當的時候自己調用processPendingChanges。


查看完整回答
反對 回復 2019-11-13
?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

聽起來好像您正在后臺線程上進行合并。更改的合并需要在main / UI線程上完成,事件才能正確觸發。但是,如果您使用父/子MOC,因為它們在內部處理這些通知,那么這沒有什么意義。

查看完整回答
反對 回復 2019-11-13
  • 3 回答
  • 0 關注
  • 471 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號