モデルを初期化しています。ローカル DB が存在しない場合は、バックエンド サーバーにクエリを実行してデータを取得し、コア データに格納します (最初の if ステートメント)。しかし、保存しようとすると「NSInternalInconsistencyException This NSPersistentStoreCoordinator
has nopersistent stores」という例外が発生します(つまり[self.gameDB saveToURL:self.gameDB.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL]
)
- (void)setUpGameModel
{
if (!self.gameDB) {
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"GameDatabase"];
self.gameDB = [[UIManagedDocument alloc] initWithFileURL:url];
}
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.gameDB.fileURL path]]) {
// does not exist on disk, so create it
dispatch_queue_t fetchQ = dispatch_queue_create("New Game Fetcher", NULL);
dispatch_async(fetchQ, ^{
[self.gameDB.managedObjectContext performBlock:^{ // perform in the NSMOC's safe thread (main thread)
[Game queryGameFromServerWithLevel:@"1" inManagedObjectContext:self.gameDB.managedObjectContext];
[self.gameDB saveToURL:self.gameDB.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
}];
});
} else if (self.gameDB.documentState == UIDocumentStateClosed) {
// exists on disk, but we need to open it
[self.gameDB openWithCompletionHandler:^(BOOL success) {
[Game queryGameWithLevel:@"1" inManagedObjectContext:self.gameDB.managedObjectContext];
}];
} else if (self.gameDB.documentState == UIDocumentStateNormal) {
// already open and ready to use
[Game queryGameWithLevel:@"1" inManagedObjectContext:self.gameDB.managedObjectContext];
}
}