gpt4 book ai didi

objective-c - 核心数据 mergeChangesFromContextDidSaveNotification 不起作用

转载 作者:行者123 更新时间:2023-11-29 11:23:18 26 4
gpt4 key购买 nike

我正在为一个更大的 iOS 应用程序编写一个 Core Data ContextManager。 ContextManager 提供一个 NSManagedContext,当其他 ContextManager 将它们的 NSMangedContext 保存到持久数据存储时,它会自动更新。

我有一个单元测试 (TestContextManager),它创建两个上下文,将一个对象添加到其中一个,然后测试该对象是否出现在另一个上下文中。它没有。 为什么上次测试失败了?

这是 ContextManager 和失败的单元测试的代码。单元测试中的最后一个断言失败。其他所有断言都通过了。如您所见,ContextManager 依赖于从不同的 ContextManager 获取更改通知并使用 mergeChangesFromContextDidSaveNotification 来更新自身。请注意,对于此测试,一切都发生在同一个线程上。

我知道 NSManagedObjectContextDidSaveNotification 正在正确发送和接收。我知道 NSManagedObjectContextDidSaveNotification 在其 userInfo 字典中有正确的数据。

我还使用 SQLite 持久存储在实际设备上将此单元测试作为应用程序测试运行——相同的断言失败。

提前致谢!

上下文管理器:

#import "ContextManager.h"

@implementation ContextManager

@synthesize context;

#pragma mark - Custom code
- (void)save {

NSError *error = nil;
if (self.context != nil) {
if ([self.context hasChanges] && ![self.context save:&error]) {

NSAssert1(FALSE, @"Unable to save the managed object context. UserInfo:\n%@", [error userInfo]);

}
}

return;
}

- (void)mergeChanges:(NSNotification *)notification {

if (notification.object != self.context) {

[self.context mergeChangesFromContextDidSaveNotification:notification];

}

return;
}

#pragma mark - Overridden NSObject methods
#pragma mark Creating, copying, and deallocating object
- (id)initWithPersistentStoreCoordinator:(NSPersistentStoreCoordinator *)persistentStoreCoordinator {

self = [super init];

if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChanges:) name:NSManagedObjectContextDidSaveNotification object:nil];
self.context = [[[NSManagedObjectContext alloc] init] autorelease];
[self.context setPersistentStoreCoordinator:persistentStoreCoordinator];
}

return self;
}

- (void)dealloc {

[context release];
[super dealloc];
return;
}

@end

测试上下文管理器:

#import "TestContextManager.h"
#import "ContextManager.h"
#import "CoreDataManager.h"

#define TEST_MANAGED_OBJECT @"AManagedObject"

@implementation TestContextManager

- (void)testContextManager {

CoreDataManager *coreDataManager = [[CoreDataManager alloc] init];
coreDataManager.storeType = NSInMemoryStoreType;

ContextManager *contextManagerA = [coreDataManager provideContextManager];
if (!contextManagerA) STFail(@"CoreDataManager did not provide a context manager.");

NSManagedObjectContext *contextA = contextManagerA.context;
if (!contextA) STFail(@"ContextManager did not provide a managed object context.");

// setA1 has 0 objects (or whatever is initially there).
NSSet *setA1 = [contextManagerA.context registeredObjects];
[NSEntityDescription insertNewObjectForEntityForName:TEST_MANAGED_OBJECT inManagedObjectContext:contextManagerA.context];

// setA2 has 1 object.
NSSet *setA2 = [contextManagerA.context registeredObjects];
STAssertTrue([setA2 count] == [setA1 count]+1, @"Context provided by ContextManager is not accepting new objects.");
[contextManagerA save];

ContextManager *contextManagerB = [coreDataManager provideContextManager];
[NSEntityDescription insertNewObjectForEntityForName:TEST_MANAGED_OBJECT inManagedObjectContext:contextManagerB.context];
[contextManagerB save];

NSSet *setA3 = [contextManagerA.context registeredObjects];

// setA3 should have 2 objects <=== THIS TEST FAILS
STAssertTrue([setA3 count] == [setA1 count]+2, @"Context is not updating new objects.");

[coreDataManager release];


return;
}

@end

最佳答案

您是否真的设置了 ContextManager 来观察保存 managedObjectContext 的通知?你没有在这里展示,所以我只想介绍最简单的情况。

抱歉,我应该在 Erik 的帖子上发表评论。

关于objective-c - 核心数据 mergeChangesFromContextDidSaveNotification 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5574051/

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