尝试清除和保存不同的上下文时访问错误
Bad access when trying to clear and save different contexts
我需要定期更新我坚持使用的数据 Core Data
。我从对 REST 服务的异步调用中获取此类数据。为了首先检索所有数据,我在私有队列中创建了一个完整的核心数据堆栈,然后我这样做:
- (void)updateDataFromServices
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
self.dataUpdatePrivateContext = [MyCoreDataStackHelper getPrivateContext];
if (self.dataUpdatePrivateContext != nil) {
[self.dataUpdatePrivateContext performBlockAndWait: ^{
// Asynchronous operations
[self callService1];
[self callService2];
[self callService3];
}];
}
}
在调用的每个服务的回调中,我检查其余服务是否也已完成,如果全部完成,我调用一个方法 (manageInfoUpdate
) 来处理数据之间的更新我在我的主上下文中(在主线程中)和我现在在私有上下文中(在私有队列中)的数据:
- (void)manageInfoUpdate
{
const char* UpdateInfoQueue = "com.comp.myapp.updateinfo";
dispatch_queue_t queue = dispatch_queue_create(UpdateInfoQueue, NULL);
dispatch_async(queue,^{
// Handle updates from private context:
// Here I compare objects in the main context with the objects
// in the private context and I delete objects from both
// by calling:
[mainContext deleteObject:object];
[self.dataUpdatePrivateContext deleteObject:object];
// This seems to work...
// Save and clear private context
[self saveContext:self.dataUpdatePrivateContext];
[self clearContext:self.dataUpdatePrivateContext];
dispatch_async(dispatch_get_main_queue(), ^{
// Re-fetch from main context to get
// the updated data
// Save main context
[self saveContext:mainContext];
// Notify end of updates
});
});
}
我尝试在另一个异步线程中执行 manageInfoUpdate
操作。我在尝试清除/保存上下文时遇到 EXEC_BAD_ACCESS
异常...有人可以帮我找出原因吗?
提前致谢
你不会因为在多线程环境中不正确地使用 Core Data 而得到直接的 "error"。应用有时会崩溃。
要确认您是否正确使用它,请在您的运行时参数中打开调试标志 com.apple.CoreData.ConcurrencyDebug 1
。然后每次您从错误的队列中触摸 MOC 或 MO 时它都会崩溃。
就线程而言,目前您的代码根本不正确。在一个队列上创建的 MO 只能从该队列访问。同样,为主队列配置的 MOC 必须在主队列上访问,而配置为专用队列的 MOC 必须在 ITS 专用队列上访问。
您的 "UpdateInfoQueue" 完全违反了线程规则。
打开调试标志,更正它显示的错误,您的保存问题将得到更正。
我需要定期更新我坚持使用的数据 Core Data
。我从对 REST 服务的异步调用中获取此类数据。为了首先检索所有数据,我在私有队列中创建了一个完整的核心数据堆栈,然后我这样做:
- (void)updateDataFromServices
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
self.dataUpdatePrivateContext = [MyCoreDataStackHelper getPrivateContext];
if (self.dataUpdatePrivateContext != nil) {
[self.dataUpdatePrivateContext performBlockAndWait: ^{
// Asynchronous operations
[self callService1];
[self callService2];
[self callService3];
}];
}
}
在调用的每个服务的回调中,我检查其余服务是否也已完成,如果全部完成,我调用一个方法 (manageInfoUpdate
) 来处理数据之间的更新我在我的主上下文中(在主线程中)和我现在在私有上下文中(在私有队列中)的数据:
- (void)manageInfoUpdate
{
const char* UpdateInfoQueue = "com.comp.myapp.updateinfo";
dispatch_queue_t queue = dispatch_queue_create(UpdateInfoQueue, NULL);
dispatch_async(queue,^{
// Handle updates from private context:
// Here I compare objects in the main context with the objects
// in the private context and I delete objects from both
// by calling:
[mainContext deleteObject:object];
[self.dataUpdatePrivateContext deleteObject:object];
// This seems to work...
// Save and clear private context
[self saveContext:self.dataUpdatePrivateContext];
[self clearContext:self.dataUpdatePrivateContext];
dispatch_async(dispatch_get_main_queue(), ^{
// Re-fetch from main context to get
// the updated data
// Save main context
[self saveContext:mainContext];
// Notify end of updates
});
});
}
我尝试在另一个异步线程中执行 manageInfoUpdate
操作。我在尝试清除/保存上下文时遇到 EXEC_BAD_ACCESS
异常...有人可以帮我找出原因吗?
提前致谢
你不会因为在多线程环境中不正确地使用 Core Data 而得到直接的 "error"。应用有时会崩溃。
要确认您是否正确使用它,请在您的运行时参数中打开调试标志 com.apple.CoreData.ConcurrencyDebug 1
。然后每次您从错误的队列中触摸 MOC 或 MO 时它都会崩溃。
就线程而言,目前您的代码根本不正确。在一个队列上创建的 MO 只能从该队列访问。同样,为主队列配置的 MOC 必须在主队列上访问,而配置为专用队列的 MOC 必须在 ITS 专用队列上访问。
您的 "UpdateInfoQueue" 完全违反了线程规则。
打开调试标志,更正它显示的错误,您的保存问题将得到更正。