Pas*_*que 7 cocoa model key-value-observing key-value-coding
在阅读了键值编码编程指南,键值观察编程指南和模型对象实现指南,以及阅读关于该主题的许多StackOverflow条目并尝试各种建模场景之后,我觉得我对如何建模我的数据.
我最终使用所有属性的声明属性和一个由私有ivars支持的关系.对于需要可私有写入的只读属性,我readonly在.h接口声明中使用该属性,然后readwrite使用.m文件中声明的类扩展中的属性重新声明该属性.在类方法中,我总是使用带有点语法的属性访问器,并且永远不会直接访问私有的ivars.
然而,有一个方面让我感到困惑:如何正确地建模到多个关系,特别是当集合是公开不可变的,但私下可变的(即模型对象的消费者不能添加或删除集合中的对象,但该集合的内容由该类私人管理).
我明白了如何实现一对多关系(KVC的存取方法countOf<Key>,objectsIn<Key>AtIndex等等),这是我到目前为止一直在跟随的路线.
但是,我已经看到一些示例代码使用声明的属性来公开关系,不实现KVC访问器方法,但仍然是Key-Value可观察的.例如:
@interface MyModel : NSObject
{
// Note that the ivar is a mutable array,
// while the property is declared as an immutable array.
@private NSMutableArray *transactions_;
}
@property (nonatomic, retain, readonly) NSArray transactions;
@end
--------------------
@implementation MyModel
@synthesize transactions = transactions_;
- (void)privateMethodThatManagesTransactions
{
[[self mutableArrayValueForKey:@"transactions"] addObject:t];
}
@end
Run Code Online (Sandbox Code Playgroud)
如果使用者对象将自身添加MyModel为"transactions"关键路径的实例的观察者,则只要transactions通过该mutableArrayValueForKey:方法添加或删除事务,就会通知它(只要通过该方法完成突变).
对我而言,这似乎是揭示多对关系的最干净的方式,因为我不需要手动编写集合KVC访问器并且它保持代码清洁.
然而,它似乎并不是Apple文档推广的方式,我不禁怀疑它的工作原理是否只是一个不可靠的副作用.
因此,在我开始研究的项目中,在我的现实模型类中提交一种技术或其他技术之前,我想得到有经验的Cocoa开发人员的意见和建议.
所以问题是:如果我使用属性来建模到多个关系,我还需要实现KVC访问器/ mutator方法吗?
更新
即使我声明了一个to-many属性readonly,就像在上面的例子中一样,外部代码仍然可以调用mutableArrayValueForKey:@"transactions"模型对象并改变集合.这似乎表明,使用声明的属性来实现多种关系并不是一种可行的方式,但我仍然觉得我不太明白......
是.
然而,有一个方面让我感到困惑:如何正确地模拟多对关系,特别是当集合是公开不可变的,但私下可变的......
Easy:readonly在标题中声明属性,然后在实现文件的类扩展中重新声明它readwrite, copy.
我明白了如何实现一对多关系(KVC的存取方法
countOf<Key>,objectsIn<Key>AtIndex等等),这是我到目前为止一直在跟随的路线.
也有变异的.有了这些,你不需要使用mutableArrayValueForKey:; 相反,您可以直接使用mutative访问器.您仍然会收到KVO通知,因为KVO会在第一次将自身添加为属性的观察者时包装这些方法.
我在我的博客上有一个访问器选择器格式列表,包括mutative访问器.
编辑:
即使我将read -ly声明为to-many属性,如上例所示,外部代码仍然可以调用
mutableArrayValueForKey:@"transactions"模型对象并改变集合.
这是使习惯使用变异访问器并避免使用的一个很好的理由mutableArrayValueForKey:.如果您在任何时候尝试编译器警告(没有这样的[公共]方法),您将不会从类外部发送变异消息.
尽管mutableArrayValueForKey:有人会使用它并且存在使用它的风险,但符合KVO标准的属性是这里的方式.
| 归档时间: |
|
| 查看次数: |
781 次 |
| 最近记录: |