传递数据集

时间:2020-03-05 18:44:07  来源:igfitidea点击:

最后一个问题一直困扰着我。我主要是.net开发人员,涉足iPhone和Mac的Objective-C。

如何在Objective-C中的方法之间发送"数据集"。例如,在C中,我们可以使用数据填充自定义类,并将其传递到自定义类类型的列表中。 EG,如果我们有客户类别,则可以执行以下操作:

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

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

解决方案

回答

我们走在正确的轨道上。

可可的集合类都具有可变的不可变变体,分别是:

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

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

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

这意味着,如果将可变数组传递给采用数组的对象,则将其复制,如果将其传递给其他对象,则将再次复制。诀窍是,尽管"复制"一个不变的对象实际上只是保留了它,所以我们只对第一个副本进行了操作。无论如何,我们可能都想第一次进行复制,这样就不会将可变数组传递给其他对象,而是在将其传递给任何对象的后面进行变异。

对于Mac OS X上的Cocoa,我也强烈建议我们看一下Core Data。它是我们可能习惯于从.NET / ADO / etc中使用的"数据集"模式的替代方法。使用Core Data,我们无需"吸引所有客户",然后再传递该集合。取而代之的是,我们查询我们关心的客户,并且当我们遍历所查询对象的关系时,其他对象将自动为我们提供。

Core Data还为我们提供功能,例如对实体进行可视化建模,自动生成属性获取器和设置器,对从一种模式版本到另一种模式版本的迁移进行细粒度控制等。