我仍然很难理解核心数据如何在后台线程中工作,即使在阅读了很多关于它的事情后,尤其是删除对象。删除核心数据对象并保存在后台线程中
举个例子,如果我想删除这样的背景下一个对象:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSManagedObjectContext *context = [self managedObjectContext];
if (editingStyle == UITableViewCellEditingStyleDelete)
{
// Delete object from database
[context deleteObject:[self.tests objectAtIndex:indexPath.row]];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
return;
}
[self.tests removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
这个工作,但是当数据量大,[context save:&error]
需要花费大量的时间,所以我该怎么办它在后台? 看来我不能用另一个上下文工作,否则我得到错误an nsmanagedobjectcontext cannot delete objects in other contexts
。 我已经尝试了数百种不同的东西,但我迷失了... 谢谢!
谢谢!这似乎工作。我只是想知道:是否可以只使用NSPrivateQueueConcurrencyType? – jcr
只要您使用performBlock/perfomBlockAndWait从管理对象中读取它就没有问题。 Tableview代码特别有点尴尬,因为你必须从performBlockAndWait调用中复制这些值,将它们设置在单元格中。从NSMainQueueConcurrencyType开始(因此您可以在块中设置单元格属性),然后转换为专用队列(如果有意义)。 – ImHuntingWabbits