当前位置:  开发笔记 > IOS > 正文

应该将"to-many"关系建模为属性吗?

如何解决《应该将"to-many"关系建模为属性吗?》经验,为你挑选了1个好方法。

在阅读了键值编码编程指南,键值观察编程指南模型对象实现指南,以及阅读关于该主题的许多StackOverflow条目并尝试各种建模场景之后,我觉得我对如何建模我的数据.

我最终使用所有属性的声明属性和一个由私有ivars支持的关系.对于需要可私有写入的只读属性,我readonly.h接口声明中使用该属性,然后readwrite使用.m文件中声明的类扩展中的属性重新声明该属性.在类方法中,我总是使用带有点语法的属性访问器,并且永远不会直接访问私有的ivars.

然而,有一个方面让我感到困惑:如何正确地建模到多个关系,特别是当集合是公开不可变的,但私下可变的(即模型对象的消费者不能添加或删除集合中的对象,但该集合的内容由该类私人管理).

我明白了如何实现一对多关系(KVC的存取方法countOf,objectsInAtIndex等等),这是我到目前为止一直在跟随的路线.

但是,我已经看到一些示例代码使用声明的属性来公开关系,不实现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

如果使用者对象将自身添加MyModel"transactions"关键路径的实例的观察者,则只要transactions通过该mutableArrayValueForKey:方法添加或删除事务,就会通知它(只要通过该方法完成突变).

对我而言,这似乎是揭示多对关系的最干净的方式,因为我不需要手动编写集合KVC访问器并且它保持代码清洁.

然而,它似乎并不是Apple文档推广的方式,我不禁怀疑它的工作原理是否只是一个不可靠的副作用.

因此,在我开始研究的项目中,在我的现实模型类中提交一种技术或其他技术之前,我想得到有经验的Cocoa开发人员的意见和建议.

所以问题是:如果我使用属性来建模到多个关系,我还需要实现KVC访问器/ mutator方法吗?

更新

即使我声明了一个to-many属性readonly,就像在上面的例子中一样,外部代码仍然可以调用mutableArrayValueForKey:@"transactions"模型对象并改变集合.这似乎表明,使用声明的属性来实现多种关系并不是一种可行的方式,但我仍然觉得我不太明白......



1> Peter Hosey..:

是.

然而,有一个方面让我感到困惑:如何正确地模拟多对关系,特别是当集合是公开不可变的,但私下可变的......

Easy:readonly在标题中声明属性,然后在实现文件的类扩展中重新声明它readwrite, copy.

我明白了如何实现一对多关系(KVC的存取方法countOf,objectsInAtIndex等等),这是我到目前为止一直在跟随的路线.

也有变异的.有了这些,你不需要使用mutableArrayValueForKey:; 相反,您可以直接使用mutative访问器.您仍然会收到KVO通知,因为KVO会在第一次将自身添加为属性的观察者时包装这些方法.

我在我的博客上有一个访问器选择器格式列表,包括mutative访问器.

编辑:

即使我将read -ly声明为to-many属性,如上例所示,外部代码仍然可以调用mutableArrayValueForKey:@"transactions"模型对象并改变集合.

这是使习惯使用变异访问器并避免使用的一个很好的理由mutableArrayValueForKey:.如果您在任何时候尝试编译器警告(没有这样的[公共]方法),您将不会从类外部发送变异消息.

尽管mutableArrayValueForKey:有人会使用它并且存在使用它的风险,但符合KVO标准的属性这里的方式.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有