首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多数据库并行访问iOS-App的设计

多数据库并行访问iOS-App的设计
EN

Stack Overflow用户
提问于 2012-01-17 16:50:13
回答 2查看 768关注 0票数 1

在我的应用程序中,我使用JSON内容获取请求,解析它们并将它们存储在CoreData中。同时,用户与DB进行交互(读写访问)。

在将数据存储到DB之后,开始基于接收到的数据创建新数据的第二任务。我将使用中央调度中心进行解析,并将数据存储到数据库中。

我的问题是,当使用GCD时,我得到了一个EXC_BAD_ACCESS,这可能是由于我假设的核心数据的非线程安全导致的。另一个错误是在使用context performBlockAndWait时出现死锁。

我应该如何设计我的应用程序来正确处理GCD和NSMutableContexts

-编辑

现在我已经阅读了核心数据编程指南,我必须使用线程限制模式。

我的应用程序目前的结构是这样的:我有两个管理器,每个管理器都有自己的上下文。但是当使用多个线程时,我遇到了3个线程调用同一个管理器的情况,这意味着一个上下文由3个线程同时使用。这会导致死锁。

为了解决这个问题,我产生了这样一个想法,即通过线程名创建上下文:

代码语言:javascript
复制
- (NSManagedObjectContext *)createManagedObjectContextWithTreadName:(NSString*) threadname {

    if([NSThread currentThread].name.length ==0){
        [NSThread currentThread].name = threadname; 
    }

    NSManagedObjectContext *context = nil;
    context = [self.contextStore objectForKey:threadname];

    if(!context){
        NSLog(@"Creating context for threadname: %@",threadname);

        NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
        if (coordinator != nil)
        {
            context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
            context.persistentStoreCoordinator = coordinator;
            context.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy;

            NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
            [nc addObserver:self selector:@selector(mergeChangesFromMOC:) name:NSManagedObjectContextDidSaveNotification object:context];
            [self.contextStore setValue:context forKey:threadname];
        }
    }
    return context;
}

这是个好主意吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-19 19:17:31

好的--这是我如何解决这个问题的:

代码语言:javascript
复制
+(NSManagedObjectContext *)managedObjectContext {
    AppDelegate *delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    NSManagedObjectContext *moc = delegate.managedObjectContext;

    NSThread *thread = [NSThread currentThread];

    if ([thread isMainThread]) {
        return moc;
    }

    // a key to cache the context for the given thread
    NSString *threadKey = [NSString stringWithFormat:@"%p", thread];

    // delegate.managedObjectContexts is a mutable dictionary in the app delegate
    NSMutableDictionary *managedObjectContexts = delegate.managedObjectContexts;

    if ( [managedObjectContexts objectForKey:threadKey] == nil ) {
        // create a context for this thread
        NSManagedObjectContext *threadContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

        threadContext.persistentStoreCoordinator = [moc persistentStoreCoordinator];
        threadContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy;

        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
        [nc addObserver:self selector:@selector(mergeChangesFromMOC:) name:NSManagedObjectContextDidSaveNotification object:threadContext];

        // cache the context for this thread
        [managedObjectContexts setObject:threadContext forKey:threadKey];
        //NSLog(@"MocCount: %d",managedObjectContexts.count);
    }

    return [managedObjectContexts objectForKey:threadKey];
}

+ (void)mergeChangesFromMOC:(NSNotification *)aNotification {

    //NSLog(@"Performing a merge of managed object context in class %@",[self class]);

    @try {
        AppDelegate *delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
        NSManagedObjectContext *moc = delegate.managedObjectContext;
        [moc mergeChangesFromContextDidSaveNotification:aNotification];


        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
        [nc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:[aNotification object]];      
    }
    @catch (NSException * e) {
        NSLog(@"Stopping on exception: %@", [e description]);
    }
    @finally {}
}

在我需要上下文的任何地方,我都会询问ContainingClass managedObjectContext并获得主线程或我所在线程的上下文。当需要合并时,这是在主线程上执行的。

票数 2
EN

Stack Overflow用户

发布于 2012-01-17 17:44:19

从阅读Concurrency with Core Data开始。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8891824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档