0

マルチスレッドアプリケーションでコアデータにデータを保存する際に問題が発生しています。シナリオは次のとおりです。

バックグラウンドスレッド 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。どうすればこの問題を解決できると思いますか?

4

2 に答える 2

0

このリンゴの例を見ましたか?

あなたのコードは良さそうに見えますが、バックグラウンド スレッドごとに NSManageObject を作成することは重要な考え方の 1 つにすぎません。この例は、 を使用し NSManagedObjectContextDidSaveNotificationてデータを安全に保存する方法を示しています。

于 2012-07-27T09:07:01.203 に答える
0

メインスレッドで保存する必要があります。を作成しNSNotificationてメインスレッドに新しいデータを通知し、そこに保存するだけです。複数のコンテキストは必要ありません。

于 2012-07-27T08:06:07.620 に答える