在多线程应用程序中保存核心数据的问题

时间:2012-07-27 08:04:00

标签: ios ios5 core-data ios4 core-data-migration

我遇到了在多线程应用程序中保存Core Data中的数据的问题。方案如下:

我有一些http请求在后台线程运行我们NSOperation。当数据到达JSON时,我试图将这些数据保存在Core Data中。 我现在为每个线程创建了单独的NSManagedObjectContext当我尝试保存它从未正确保存的数据时。有时半数数据会被保存。

任何猜测为什么这是halaneing

+ (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。有什么猜测我怎么解决这个问题?

2 个答案:

答案 0 :(得分:0)

您需要保存主线程。只需创建一个NSNotification并通知新数据的主线程并保存在那里。不需要多个上下文。

答案 1 :(得分:0)

您看到了this apple example吗?

您的代码似乎很好但是为每个后台线程创建NSManageObject只是一个重要的想法。此示例可以向您显示如何使用NSManagedObjectContextDidSaveNotification并以安全的方式保存数据。