AFIncrementalStore是否需要NSMainQueueConcurrencyType上下文?

时间:2013-08-30 12:34:08

标签: objective-c multithreading core-data afincrementalstore

我一直在努力将AFIncrementalStore合并到我们的应用程序中,遵循使用SQLite后备存储的存储库中的示例代码。所有示例都使用带有NSMainQueueConcurrencyType的单例managedObjectContext。

+ (NSManagedObjectContext *)managedObjectContext {
    static NSManagedObjectContext *_managedObjectContext = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        if (coordinator != nil) {
            _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
            [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        }
    });

    return _managedObjectContext;
}

使用这个moc,我可以执行提取,看到它从网络中提取,并存储在sqlite后备存储中。我尝试将其更改为使用NSPrivateQueueConcurrencyType,当我看到网络请求时,没有任何内容保存到SQLite后备存储。但是,如果我将此moc与主队列并发,然后从中创建一个子项,并使用那个 moc,那么一切都可以保存。

+ (User *)user
{
    // grab a user if we already have one
    NSManagedObjectContext *managedObjectContext = [VigilCoreDatabase managedObjectContext];
    NSManagedObjectContext *tmpContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    tmpContext.parentContext = managedObjectContext;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    fetchRequest.fetchLimit = 1;
    [fetchRequest setAffectedStores:@[ ]];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:tmpContext];
    [fetchRequest setEntity:entity];

    __block User *user = nil;
    [tmpContext performBlockAndWait:^{
        NSError *error = nil;
        NSArray *fetchedObjects = [tmpContext executeFetchRequest:fetchRequest error:&error];
        if (fetchedObjects == nil) {
            NSLog(@"error");
        }
        if(fetchedObjects.count > 0) {
            user = fetchedObjects[0];
        }
    }];
    return user;
}

我想弄清楚我的理解是否遗漏了一些东西。我似乎无法找到任何不使用主队列并发的moc作为父上下文的示例(后备存储使用私有队列上下文),但同时找不到任何解释是否这样的文档是必需的,或者在使用私有队列上下文而不是在堆栈中有主队列上下文时,是否需要做一些事情来手动将更改推送到父级。

1 个答案:

答案 0 :(得分:0)

此时AFIncrementalStore患有错误。我问了一个关于另一个IncrementalStore的问题(它使用相同的代码),the response让我相信AFIS需要NSMainQueueConcurrencyType