gpt4 book ai didi

objective-c - 如何告诉(托管)对象通知其 KVO:其属性之一需要重新缓存?

转载 作者:行者123 更新时间:2023-12-03 17:00:37 26 4
gpt4 key购买 nike

当我们的对象具有基于其他属性生成的属性时,通常我们会实现 +keyPathsForValuesAffecting{PropertyName} 类方法。

我想要做的事情基本上与 NSManagedObject 上的属性相同,但遍历关系。

我的模型很简单;我有两个实体,应用程序和版本(我正在创建一个应用程序生成应用程序)。当应用程序的属性更改时,因为我实现了上面的方法,所以 -appcast 字符串发生更改,并且所有绑定(bind)都会相应更新。

但是,当任何特定应用程序版本(一对多关系)上的任何属性发生更改时,-appcast 属性不会正确生成。我可以修复/解决方法吗?

最佳答案

这个答案有点晚了,但我认为这是一种常见情况,而且答案绝对不是显而易见的。

我通常会观察 ManagedObjectContext 的更改,然后检查更改的对象是否是我想要查找的对象。因此,在您的 NSManagedObject 子类中:

// We need to register for the notification in both awakeFromFetch
// AND awakeFromInsert, since either one could be called, depending on
// if the object was previously-created or not
- (void)awakeFromFetch {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidChange:) name: NSManagedObjectContextObjectsDidChangeNotification object:[self managedObjectContext]];
}

- (void)awakeFromInsert {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidChange:) name: NSManagedObjectContextObjectsDidChangeNotification object:[self managedObjectContext]];
}

- (void)managedObjectContextDidChange:(NSNotification *)notification {
// Get a set containing ALL objects which have been changed
NSSet *insertedObjects = [[notification userInfo] objectForKey:NSInsertedObjectsKey];
NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
NSSet *deletedObjects = [[notification userInfo] objectForKey:NSDeletedObjectsKey];

NSSet *changedObjects = [insertedObjects setByAddingObjectsFromSet:updatedObjects];
changedObjects = [changedObjects setByAddingObjectsFromSet:deletedObjects];

if ([changedObjects intersectsSet:[self versions]]) {
[self willChangeValueForKey:@"appCast"];
[self didChangeValueForKey:@"appCast"];
}
}

从性能角度来看,这当然并不理想,因为每次对象图中的任何内容发生变化时都会触发此通知,但我发现它是实现此目的的最直接方法。

关于objective-c - 如何告诉(托管)对象通知其 KVO:其属性之一需要重新缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1182813/

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