gpt4 book ai didi

objective-c - Restkit [NSManagedObject managedObjectContext] 返回不同的实例

转载 作者:可可西里 更新时间:2023-11-01 03:44:40 26 4
gpt4 key购买 nike

自从我将核心数据逻辑迁移到 RKManagedObjectStore 后,我遇到了严重的问题。我在 View Controller 的主线程中设置了一个 NSFetchedResultsController,上下文设置为 [NSManagedObject managedObjectContext]:

assert([NSThread isMainThread]);
NSManagedObjectContext* context = [NSManagedObject managedObjectContext];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:[Item fetchRequest] managedObjectContext:context sectionNameKeyPath:nil cacheName:@"Master"];

我像这样在上下文中插入对象:

Item* item = [Item object];
item.name = @"Foo";
[[RKObjectManager sharedManager].objectStore save];

但获取的结果 Controller 不会收到更改通知。因此我手动注册了一个通知:

[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
NSLog(@"Context changed");

[self.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
}];

我认为这真的没有必要,因为 RKManagedObjectStore 合并了不同上下文中的更改。其次,为了删除我尝试的 Item 对象

[item deleteEntity];

这产生了一个错误,指出无法在另一个上下文中删除该对象。这显然是正确的,但是为什么 上下文不是主线程的同一个实例?在删除实体之前,我还在 View Controller 中调用了以下代码:

assert([NSThread isMainThread]);
NSManagedObjectContext* sameContext1 = [NSManagedObject managedObjectContext];
NSManagedObjectContext* sameContext2 = self.fetchedResultsController.managedObjectContext;
assert(sameContext1 == sameContext2); //FAILS

查看在使用 [NSManagedObject managedObjectContext] 时调用的 RKManagedObjectStore 的 ma​​nagedObjectContext getter 实现,每个线程应该返回相同的实例:

-(NSManagedObjectContext*)managedObjectContext {
NSMutableDictionary* threadDictionary = [[NSThread currentThread] threadDictionary];
NSManagedObjectContext* backgroundThreadContext = [threadDictionary objectForKey:RKManagedObjectStoreThreadDictionaryContextKey];
...
}

最佳答案

经过几个小时的调试,我终于找到了那个讨厌的错误。问题是 RKObjectManager 持有对 RKManagedObjectStore 的引用。但是不知何故,当使用 ARC 时,该引用不会保留在 [RKObjectManager sharedManager] 实例中并且正在被释放。这会导致刷新线程本地缓存。因此,托管对象上下文合并不起作用,因为每次访问都会创建一个新的托管上下文。修复很容易。只需在您的 App Delegate 中保留对 RKManagedObjectStore 的强引用即可。

关于objective-c - Restkit [NSManagedObject managedObjectContext] 返回不同的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8941412/

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