我正在使用MagicalRecord來幫助核心數據操作。在NSOperation子類中保存上下文時無法接收NSManagedObjectContextDidSaveNotification
我有一個NSOperation
子類叫OfflineRetrieveOperation
。它從服務器檢索消息並保存。 的代碼是這樣的:
NSManagedObjectContext *context = [NSManagedObjectContext contextForCurrentThread];
Message *existMessage = [Message MessageWithMessageID:messageID inManagedObjectContext:context];
if (!existMessage) {
Message *message = [Message insertMessageWithProperties:properties inManagedObjectContext:context];
}
[context save];
通報接收初始化這樣的:
- (id)init
{
self = [super init];
if (self != nil) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:[NSManagedObjectContext defaultContext]];
[self setContext:[NSManagedObjectContext context]];
}
return self;
}
日誌:
-[NSManagedObjectContext(MagicalRecord) saveWithErrorHandler:](0x5906a0) Saving Context
-[NSManagedObjectContext(MagicalRecord) mergeChangesFromNotification:](0x37eab0) Merging changes to *** DEFAULT *** context *** on Main Thread ***
一切似乎都做工精細,除了我不能接受根本不知道我已經完成檢索了。
感謝U,Marcus。 我嘗試在不同線程中執行所有類型的操作,然後將更改合併到[NSManagedObjectContext defaultContext]。 – caiguo
它是廣播通知的操作的'NSManagedObjectContext'。您需要將addNotification對象設置爲廣播者(或無)以接收通知。我建議你閱讀'NSNotification'和'NSNotificationCenter'是如何工作的。 –
由於存在可能會改變數據的不同類型的操作,通知接收者只關心defaultContext會很方便。 我想我可以這樣做: [[OfflineRetrieveOperation context] save]; [[NSManagedObjectContext defaultContext] save]; 第二次保存wile一個NSManagedObjectContextDidSaveNotification並通知接收者將收到此。 如果[通知用戶信息]沒有內容,則使用NSFetchedResultsController執行提取並獲取最新的數據。 – caiguo