传递数据集

时间:2008-08-27 20:45:37

标签: objective-c cocoa macos sqlite

最后一次思考我的一个问题。我主要是一名.net开发人员,他涉猎用于iPhone和Mac的Objective-C。

如何在objective-c中的方法之间发送“数据集”。例如,在C#中,您可以使用数据填充自定义类,并在类型自定义类的List中传递它。 EG如果您有客户类,您可以执行以下操作:

List<Customer> customers = DataLayer.GetAllCustomers();

我能看到如何在obj-c中完成这一操作的唯一方法是使用自定义对象填充NSArray?这是一种有效的做事方式吗?还有其他建议吗?我使用sqlite作为我想要返回的数据库/数据。

1 个答案:

答案 0 :(得分:24)

你走在正确的轨道上。

Cocoa的集合类 - 它们都具有可变的不可变变量 - 是:

  • NSArray:有序,可多次包含一个对象
  • NSDictionary:无序,从键映射到值,键被复制
  • NSSet:无序,只能包含一次对象
  • NSCountedSet:无序,可以多次包含一个对象

不可变的变体对效率有很大帮助。具有可变变体的类的访问器的标准模式是复制而不是保留。通过使用属性上的@property属性,将其编入copy机制中:

// Department.h
@interface Department : NSObject
@property (readwrite, copy) NSSet *employees;
@end

这意味着如果你将一个可变数组传递给一个接受数组的东西,它将被复制,如果你将它传递给其他东西,它将被再次复制。诀窍是虽然“复制”一个不可变对象实际上只是保留它,所以你只需要点击第一个副本。您可能想要首次制作副本,这样您就不会将可变数组传递给其他内容,然后在传递给它的任何内容后面改变它。

对于Mac OS X上的Cocoa,我也强烈建议您查看Core Data。它可以替代您可能习惯使用.NET / ADO /等的“数据集”模式。使用Core Data,您不会“获得所有客户”,然后传递该集合。相反,您会查询您关注的客户,并且当您遍历您查询过的对象的关系时,其他对象将自动为您拉入。

核心数据还可以为您提供诸如实体的可视化建模,自动生成属性获取器等功能。 setter,从一个模式版本到另一个模式的迁移的细粒度控制,等等。