AFIncrementalStore 是不是需要 NSMainQueueConcurrencyType 上下文?

Posted

技术标签:

【中文标题】AFIncrementalStore 是不是需要 NSMainQueueConcurrencyType 上下文?【英文标题】:Does AFIncrementalStore need an NSMainQueueConcurrencyType context?AFIncrementalStore 是否需要 NSMainQueueConcurrencyType 上下文? 【发布时间】:2013-08-30 12:34:08 【问题描述】:

按照存储库中使用SQLite 后备存储的示例代码,我一直致力于将 AFIncrementalStore 合并到我们的应用程序中。所有示例都使用带有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 与主队列并发,然后从中创建一个孩子,并使用 that 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】:

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

【讨论】:

以上是关于AFIncrementalStore 是不是需要 NSMainQueueConcurrencyType 上下文?的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 和 AFIncrementalStore 的区别

使用 AFIncrementalStore 和 AFRestClient 进行分页

AFIncrementalStore 的神奇记录

AFIncrementalStore:仅使用 ID 拉取相关实体

使用 AFIncrementalStore 从故障更新

AFIncrementalStore 将核心数据与 REST API 同步