ユーザーがアプリにログインすると、バックグラウンド スレッドでサーバーからデータをダウンロードします。その managedObjectContext をメインの managedobjectcontext の子として設定するシングルトンがあります。
-(NSManagedObjectContext*) context{
if(!_context){
NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:[MyAppDelegate delegate].managedObjectContext];
_context = child;
}
return _context;
}
ユーザーがログアウトしたら、メインの管理オブジェクトコンテキストをロックする PersistenceStoreCoordinator sqllite ファイルを削除します
-(void)onLogout{
NSError *error = nil;
if ([_persistentStoreCoordinator persistentStores] == nil)
return;
[self.managedObjectContext reset];
[self.managedObjectContext lock];
NSPersistentStore *store = [[self.persistentStoreCoordinator persistentStores] lastObject];
if (![self.persistentStoreCoordinator removePersistentStore:store error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
// Delete file
if ([[NSFileManager defaultManager] fileExistsAtPath:store.URL.path]) {
if (![[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
_persistentStoreCoordinator = nil;
_persistentStoreCoordinator = [self persistentStoreCoordinator];
[self.managedObjectContext unlock];
self.agendaLoader = nil;
_agendaLoader = self.agendaLoader;
}
同じシミュレーター セッションで (アプリを停止せずに) ログアウト/ログインすると、シングルトンの save メソッドが次のエラーでクラッシュします。
This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
しかし、ログアウト/アプリを停止/アプリを再起動/ログインすると、問題なく動作します。
ログアウト時に子の managedobjectcontext をリセットしようとしましたが、結果はありませんでした..
すべての管理対象オブジェクト コンテキストをリセットし、storecoordinator ファイルを削除し、すべてのコア データ スタックを「再起動」するためのベスト プラクティスはありますか?
ご協力いただきありがとうございます。