- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
主上下文在主队列中工作,单独的操作在单独的线程中工作,并且上下文使用私有(private)队列初始化。一切都按预期工作得很好,但发生了一个小问题。
我发现有时当我从后台线程删除记录时,我会遇到有关访问 FRC 内的故障对象的异常。看来当FRC处理它得到的条目并且后台线程删除相同的对象时,就会发生这种情况。
我应该怎样做才能防止异常发生?我看到的一种解决方案是在托管对象上使用特殊属性来指示它(对象)已被删除。或者也许我应该以某种方式告诉后台任务在 FRC 完成工作之前不要删除条目。
已编辑:我的代码订阅了 NSManagedObjectContextDidSaveNotification。目标SDK:iOS 7
主上下文:
- (NSManagedObjectContext *)mainManagedObjectContext
{
if (_mainManagedObjectContext != nil) {
return _mainManagedObjectContext;
}
_mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_mainManagedObjectContext.persistentStoreCoordinator = [self persistentStoreCoordinator];
return _mainManagedObjectContext;
}
背景上下文:
- (NSManagedObjectContext*)newPrivateContext
{
NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
context.persistentStoreCoordinator = self.persistentStoreCoordinator;
return context;
}
最佳答案
Or maybe I should somehow tell the background task not no delete entries until FRC finishes its work.
那就是 stinky代码。后台线程不需要知道 Controller 在做什么。
更现代的模式是
- (NSManagedObjectContext*)newPrivateContext
{
NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
context.parent = self.mainManagedObjectContext;
return context;
}
然后...
NSManagedObjectContext *workerContext = [self newPrivateContext];
[workerContext performBlock:^{
//stuff to be done on the background thread
NSError *error = NULL;
if ([context save:&error]) {
//handle error
}
}];
这项工作将在后台线程上完成,您可以删除对 NSManagedObjectContextDidSaveNotification
的观察,因为在两个上下文之间建立父子关系会自动处理该关系。
不确定这是否是您问题的全部,但如果您做得不正确,使用NSManagedObjectContextDidSaveNotification
可能会导致奇怪的情况。
关于objective-c - NSFetchedResultsController,后台线程中的多线程和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20325449/
我是一名优秀的程序员,十分优秀!