gpt4 book ai didi

iphone - NSManagedObjectContext 没有正确刷新

转载 作者:太空狗 更新时间:2023-10-30 03:51:28 24 4
gpt4 key购买 nike

嗨 :) 我有类似的问题,如 Working with the same NSManagedObjectContext in multiple tabs
背景:
我的 managedObjectContext(进一步的 MOC)在我的 appDelegate 类中初始化,并通过
传递给多个选项卡 myViewController.managedObjectContext = self.managedObjectContext;或者在初始化方法中使用 self.managedObjectContext = pContext;流程是:第一个 View 是一个简单的集合列表。这些集合是使用 NSFetchedResultsController ( myViewController : UITableViewController<NSFetchedResultsControllerDelegate> ) 获取的。通过选择一个,您可以更深入地导航,但仍会通过此 MOC。
在下一个 Controller (detailsViewController) 中,我列出了这个集合中我可以与之交互的一些项目(例如设置开关)。
我还有一个 editingObjectContext:

// DetailsViewController.m
NSManagedObjectContext* editingContext = [[NSManagedObjectContext alloc] init];
[editingContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];
self.editingObjectContext = editingContext;

现在我的问题是:因为我的 View 必须旋转,所以我使用了以下技巧:

// 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;

此外,我还有一个按钮来管理这些项目(应显示哪些项目,哪些不显示)。此按钮只是使用新的 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];
}

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

// 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];
}

但是在我选择托管 View 中的项目并单击保存 (manageItems) 之后, View 不显示它们:/我必须切换选项卡或在其他 Controller (父级或更深层)中导航以实现它.我的 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]
}

和 viewWillDisapper 调用

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

// send save-command to server
}

在早期的 Verison 中,只有 1 个 View 有效,而且我并没有真正改变太多...:/所以我不明白为什么 MOC 会像现在这样。 “manageItems”部分几乎相同,只是在新版本中更深一层(在 DetailsView 而不是 Controller 中)...

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

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

Error in handleChangeResponse: Error Domain=NSCocoaErrorDomain Code=133020 "The operation couldn’t be completed. (Cocoa error 133020.)" UserInfo=0x4d8bb90 {conflictList=( "NSMergeConflict (0x5a2fac0) for NSManagedObject (0x5a46a80) with objectID '0x5a46420 ' with oldVersion = 7 and newVersion = 8 and old object snapshot = {\n iconName = noicon;\n [...] ;\n} and new cached row = {\n iconName = noicon;\n [...] \n}" )}

如果您有任何疑问或需要更多代码(即旧版本的代码),请询问 ;)

感谢期待:)

最佳答案

看来我有办法了!从 IOS 5.0 开始,NSManagedObjectContext 有了一个新方法:

[managedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];

发现于 http://pauloliveira.net/tech/core-data-merging-conflicts
将此属性设置为顶级 MOC(在我的例子中是在 appDelegate 中),别无其他!清除我的合并问题;)

关于iphone - NSManagedObjectContext 没有正确刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com