【问题标题】:Saving core data objects in HTTP response在 HTTP 响应中保存核心数据对象
【发布时间】:2015-07-19 00:11:21
【问题描述】:

考虑以下一段代码,它是获取特定用户名的用户数据的简单请求。

- (void)updateInformation
{
    AFHTTPRequestOperationManager *httpManager = [AFHTTPRequestOperationManager sharedManager];
    NSDictionary *params = @{@"username": self.username};
    AFHTTPRequestOperation *operation = <create_op>

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id response){
        // use response to populate user
        // self.fullname = response[@"fullname"];
    }failure:nil];

    [httpManager.operationQueue addOperation:operation];
}

此代码是特定实体类别的一部分,例如User

现在通常在scheduleBlock 中调用此方法。 scheduleBlock (http://cocoadocs.org/docsets/XMPPFramework/3.6.1/Classes/XMPPCoreDataStorage.html#//api/name/scheduleBlock:):

此方法异步调用 storageQueue 上的给定块 (dispatch_async)。

现在我的问题很简单——与实际调用 updateInformation 方法的 storageQueue 相比,请求响应是在不同的线程中接收的 => 需要一个不同的托管对象上下文创建用于存储对象,然后将这些更改与存储队列的上下文同步。 是这样吗?

另一个问题是 - 有没有更好的方法来处理这个问题,即不创建新上下文并尝试将其与存储队列上下文同步?

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    您可以使用相同的上下文,但由于您来自另一个线程/队列,因此您需要将核心数据处理代码包装在 performBlock:performBlockAndWait: 中,以便在正确的线程上完成处理与上下文相关联。

    【讨论】:

    • 问题是上面链接的代码中定义的托管对象上下文使用NSConfinementConcurrencyType并发类型(用于后台/存储moc)。因此,performBlock 不能使用。
    • 好吧,我已将并发类型更改为NSPrivateQueueConcurrencyType。我不确定它是否会产生任何影响(不是核心数据专家)。
    • NSConfinementConcurrencyType 无论如何都会在 9 中消失,所以最好改变它。您还可以打开并发调试标志并确认您没有遇到任何其他线程问题。
    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多