マルチスレッドアプリケーションでコアデータにデータを保存する際に問題が発生しています。シナリオは次のとおりです。
バックグラウンドスレッド us で実行されるいくつかの http リクエストがありますNSOperation
。JSON のデータが到着したら、それらのデータを Core Data に保存しようとしました。NSManagedObjectContext
正しく保存されないデータを保存しようとすると、スレッドごとに個別に作成しました。半分のデータが保存される場合もあれば、保存されない場合もあります。
これがハパネリングである理由を推測してください
+ (void) initialize {
contextfactory = [[ThreadedContext alloc] init];
}
- (id) init {
if((self = [super init])) {
}
[self setupObjectModel];
[self setupStoreCoordinator];
return self;
}
- (void) setupObjectModel {
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
}
- (NSString*) sharedDocumentsPath {
static NSString *SharedDocumentsPath = nil;
if (SharedDocumentsPath)
return SharedDocumentsPath;
// Compose a path to the <Library>/Database directory
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
return [[libraryPath stringByAppendingPathComponent:@"Database"] retain];
}
- (NSURL *) storeUrl {
NSString * const kCoreDataSQLiteName = @"XPPS.sqlite";
// Get the paths to the SQLite file
NSString *storePath = [[self sharedDocumentsPath] stringByAppendingPathComponent:kCoreDataSQLiteName];
return [NSURL fileURLWithPath:storePath];
}
- (void) setupStoreCoordinator {
NSError *error = nil;
if(!_persistentStoreCoordinator)
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: _managedObjectModel];
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL: [self storeUrl] options:nil error:&error];
if(error) NSLog(@"%@", error);
}
- (NSManagedObjectContext *) createObjectContext {
NSManagedObjectContext *output = [[[NSManagedObjectContext alloc] init] autorelease];
[output setPersistentStoreCoordinator:_persistentStoreCoordinator];
return output;
}
+ (NSManagedObjectContext *) buildContext {
return [contextfactory createObjectContext];
}
+ (void) createStoreCoordinator {
[contextfactory setupStoreCoordinator];
}
+ (NSString *) storePath {
return [[contextfactory storeUrl] path];
}
これは、各スレッドのマネージド コンテキストを取得するためのコードです。から派生しNSObject
、 ではありませんNSOperation
。どうすればこの問題を解決できると思いますか?