NSManagedObjectContext无法正确刷新

geo*_*geo 5 iphone merge conflict objective-c nsmanagedobjectcontext

嗨:)我有一个类似的问题,如在多个选项卡
背景中使用相同的NSManagedObjectContext:
我的managedObjectContext(进一步的MOC)在我的appDelegate类中初始化并通过
myViewController.managedObjectContext = self.managedObjectContext;或在init方法中传递到多个选项卡,self.managedObjectContext = pContext; 流程是:第一个视图是一个简单的集合列表.使用NSFetchedResultsController(myViewController : UITableViewController<NSFetchedResultsControllerDelegate>)获取集合.通过选择一个,您可以更深入地导航,但仍然通过此MOC.
在下一个控制器(detailsViewController)中,我列出了这个集合的一些项目,我可以与之交互(例如设置开关).
我还有一个editObjectContext:

// DetailsViewController.m
NSManagedObjectContext* editingContext = [[NSManagedObjectContext alloc] init];
[editingContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];
self.editingObjectContext = editingContext;
Run Code Online (Sandbox Code Playgroud)

现在我的问题:因为我的视图必须旋转,我正在使用以下技巧:

// DetailsViewController.m
DetailsView *localAct = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ]
DetailsView *localSen = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ]

UITableView *localContainerView = [[UITableView alloc] init];
self.containerView = localContainerView;
[localContainerView release];
//[...]
[containerView addSubview:actuatorView];
self.tableView = containerView;
Run Code Online (Sandbox Code Playgroud)

我还有一个按钮来管理这些项目(其中哪些应显示,哪些不显示).这个按钮只是用新的fetchResult重新加载表.

// DetailsView.m
- (void) manageItems{
managing = !managing;
[viewController setIsManaging:managing]; // parent
self.fetchedResultsController = nil;

NSError *error = nil;
[[self fetchedResultsController] performFetch:&error];

[self reloadData];
[self updateBarButton];
}
Run Code Online (Sandbox Code Playgroud)

将项目放入上下文的方法如下:

// DetailsViewController.m
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// init + create predicate
NSSet* set = [sen filteredSetUsingPredicate:predicate];
if( [set count] > 0 )
{
    for( Act* act in set )
    {
        [editingObjectContext deleteObject:act];
    }
}
else
{
    Act* act = [NSEntityDescription insertNewObjectForEntityForName:@"Act" inManagedObjectContext:editingObjectContext];

    // do things
}
NSError *error = nil;
[[detailView fetchedResultsController] performFetch:&error];

[self.containerView reloadData];
[detailView reloadData];
}
Run Code Online (Sandbox Code Playgroud)

但是在我选择了托管视图中的项目并单击了save(manageItems)之后,视图没有显示它们:/我必须切换选项卡或在其他控制器(父级或更深层)中导航才能实现它.我的ViewWillAppear方法:

// DetailsViewController.m
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
DetailsView *detailView = se ? senView : actView;
// [do uninteresting stuff]
[detailView.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
// [do uninteresting stuff]
}
Run Code Online (Sandbox Code Playgroud)

和viewWillDisapper调用

- (void)saveChanges
{
if( ![editingObjectContext hasChanges] )
    return;

// send save-command to server
}
Run Code Online (Sandbox Code Playgroud)

在一个只有1个视图的Verison Verison中,它的工作原理并没有真正改变......:/所以我不明白为什么MOC表现得像它一样."manageItems"部分几乎相同,它只是新版本中更深层次(在DetailsView而不是控制器中)......

如果有人可以告诉我我可以尝试什么(当管理和正常之间的切换不是解决方案时总是保存到服务器,因为服务器响应的延迟对刷新来说很高,所以我有更少的翻转视图使用self.tableView/detailView/self.containerView刷新刷新视图也会带来相同的结果:/).

第二个问题:我发送到服务器之后无法调用"editingObjectContext save:"方法,因为它抛出错误并且根本不保存到本地数据库.

handleChangeResponse出错:Error Domain = NSCocoaErrorDomain Code = 133020"操作无法完成.(Cocoa error 133020.)"UserInfo = 0x4d8bb90 {conflictList =(NSMergeConflict(0x5a2fac0)for NSManagedObject(0x5a46a80)with objectID'0x5a46420'with oldVersion = 7和newVersion = 8,旧对象快照= {\n iconName = noicon; \n [...]; \n}和新缓存的行= {\n iconName = noicon; \n [...] \n}")}

如果您有疑问或需要更多代码(即旧版本),那么请问;)

谢谢期待:)

geo*_*geo 6

好像我有解决方案!从IOS 5.0开始,NSManagedObjectContext有了一个新方法:

[managedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];
Run Code Online (Sandbox Code Playgroud)

http://pauloliveira.net/tech/core-data-merging-conflicts上找到
将此属性设置为顶级MOC(在我的情况下在appDelegate中)和no-where!清除我的合并问题;)