サーバーからデータを取得すると、 を使用して永続ストアに保存されますEntity mapping
。
次に、 delete
それらのオブジェクトですmanually
。
同じデータを再度プルしようとすると、HTTP 応答を nil ターゲット オブジェクトにマッピングするというエラーが表示されます...RKObjectmapperoperation
失敗しました。
メイン スレッドの get がブロックされている可能性があります。これは、削除後にレスト キットのマネージド コンテキストにオブジェクト グラフが含まれていない可能性があります。このエラーを解決する方法がわかりません。永続ストアをリセットしようとしました。
アップデート
- (void)saveThreadedContext {
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self
selector:@selector(mergeThreadedContextChangesIntoMainContext:)
name:NSManagedObjectContextDidSaveNotification
object:self.threadedContext];
if ([[self threadedContext] hasChanges]) {
NSError *error;
BOOL contextDidSave = [[self threadedContext] save:&error];
if (!contextDidSave) {
// If the context failed to save, log out as many details as possible.
NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
if (detailedErrors != nil && [detailedErrors count] > 0) {
for (NSError* detailedError in detailedErrors) {
NSLog(@" DetailedError: %@", [detailedError userInfo]);
}
} else {
NSLog(@" %@", [error userInfo]);
}
}
}
[defaultCenter removeObserver:self name:NSManagedObjectContextDidSaveNotification object:[self threadedContext]];
self.threadedContext = nil;
}
#pragma mark -
#pragma mark PrivateMethods
- (void)mergeThreadedContextChangesIntoMainContext:(NSNotification *)notification {
NSLog(@"%@:%@ merging changes", self, NSStringFromSelector(_cmd));
NSManagedObjectContext * context = ((AppDelegate *)[[UIApplication sharedApplication] delegate]).managedObjectContext;
[context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:notification waitUntilDone:YES];
}
[self saveThreadedContext];
オブジェクトを削除した後、スレッド コンテキストを保存してマージするために使用します。
[context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification waitUntilDone:YES];
ロックを保持するcontext
と、restkit がそのコンテキストをマージしようとしたときにブロックが発生します。オブジェクトの削除に使用される threadContext の作成中に使用する同時実行の種類を知りたいと考えました。試しwaitunitdone:NO
てみましたが、ブロックは再び発生しませんでした..理由の説明が必要です