- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Marcus Zarra 的《核心数据》一书中的第 40 页中,他建议,由于 NSTreeController 需要相同的 key 来访问层次结构中的所有对象(例如子对象),并且这可能意味着意义不大的关系名称,因此您可以编写额外的内容所需关系的访问器。我认为这是一个好主意,但我不确定如何实现。
让我以 Aperture 的数据模型为例:你可以有很多库,每个库可以有很多项目,每个库可以有很多照片。因此,如果我将我的实体命名为库、项目和照片及其关系项目、照片 和什么都没有,以下是库的正确实现吗?
库.h
@interface Library: NSManagedObject {
}
@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSSet *projects;
@property (nonatomic, retain) NSSet *children;
@property (nonatomic, retain) id parent;
@end
@interface Library (CoreDataGeneratedAccessors)
- (void)addProjectsObject:(Project *)value;
- (void)removeProjectsObject:(Project *)value;
- (void)addProjects:(NSSet *)value;
- (void)removeProjects:(NSSet *)value;
- (id)parent;
- (void)setParent;
@end
和Library.m
#include "Library.h"
@implementation Library
@dynamic title;
@dynamic projects;
- (NSSet*) children {
[self willAccessValueForKey:@"children"];
NSSet *set = [self valueForKey:@"projects"];
[self didAccessValueForKey:@"children"];
return set;
}
- (void) setChildren:(NSSet*)children {
[self willChangeValueForKey:@"children"];
[self setValue:children forKey:@"projects"];
[self didChangeValueForKey:@"children"];
}
- (id)parent {
[self willAccessValueForKey:@"parent"];
[self didAccessValueForKey:@"parent"];
return nil;
}
- (void)setParent:(id)parent {
// Proposed parent value is ignored. Libraries have no parent.
[self willChangeValueForKey:@"parent"];
[self didChangeValueForKey:@"parent"];
}
@end
子项和父项应该是头文件中的属性吗?
这是建议的实现吗?我还应该包含 addChildrenObject:
、removeChildrenObject:
、addChildren:
和 removeChildren:
吗?并实现它们? (父方法也是如此。)
我假设子项根本不会出现在核心数据模型中。是对的吗?那么反向关系是如何推断的呢?
我应该在 setChildren 中调用 [self willChangeValueForKey:@"children"] 吗:这样 Children 就符合 KVO 要求了吗? (其他访问器也是如此。)
在第 41 页中,M. Zarra 建议实现 NSOutlineDataSource 而不是使用 NSTreeController,因为“结果可能是意外且不清楚的”。有谁知道这些限制是什么?
最后,如果我实现 NSOutlineDataSource,您会建议缓 stub 对象的获取吗?如果是这样,保持此缓存数组与核心数据同步的正确方法是什么?
谢谢。
最诚挚的问候,
豪尔赫
最佳答案
我在这里看到的问题是,虽然设置“children”属性将触发“projects”属性的 KVO,但反之则不然。因此,如果您通过“projects”关系将项目添加到库对象,大纲 View 将不会更新,因为它不会看到“children”属性中的任何更改。
启用此功能的最简单方法是实现如下方法:
+ (NSSet*)keyPathsForValuesAffectingChildren
{
return [NSSet setWithObject:@"projects"];
}
这应该会使“projects”属性的任何更改也会触发“children”的 KVO 通知。
顺便说一句,由于“children”属性不是核心数据模型的一部分,我认为 will/didAccessValueForKey:
调用不是绝对必要的,尽管我不认为我认为他们不会伤害任何东西。另外,如果你实现了我上面提到的方法,你应该不再需要在 setChildren:
方法中调用 will/didChangeValueForKey:
,因为 Cocoa 应该自动触发 KVO当“projects”键改变时。
关于cocoa - NSOutlineView、NSTreeController 和异构层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3079839/
我有一个 NSTreeController (向 NSOutlineView 提供内容)。我希望顶级对象属于一个类,而所有其他对象(因此,任何级别的子对象)属于另一个类。解决这个问题的最佳方法是什么?
我有一个如下所示的 GADT data MyTypes = MyInt | MyDouble data Test (t :: MyTypes) where A :: Int -
我需要一个高效的异构数组,其中第一个元素是 int,其余是 float。然而,创建它之后,基本的数组操作就会呈爆炸式增长。 A = np.zeros(1, dtype='i4, f4, f4') B
我有一个 pandas DataFrame,其中包含需要拆分成平衡切片的字符串和浮点列,以便训练 sklearn 管道。 理想情况下,我会使用 StratifiedKFold在 DataFrame 上
是否有一种异构容器的形式,能够存储例如不同的基本类型(例如int、float、double)? 最终我希望能够在计算中使用元素而无需显式引用类型,例如 auto res = a + b,其中操作数 a
假设我有一个结构(或类),如下所示: struct _particle { std::vector vx , vy; std::vector id; std::vector rx, ry; }; ty
我在将具有 > 22 列的表专门映射到 case class 时遇到问题,假设您有以下代码 import slick.driver.PostgresDriver import scala.slick.
我是一名优秀的程序员,十分优秀!