提问人:JamesSugrue 提问时间:8/28/2008 最后编辑:Jonathan HallJamesSugrue 更新时间:7/17/2017 访问量:2950
传递数据集
Passing around sets of data
问:
这个问题困扰了我一段时间。我主要是一名 .net 开发人员,涉足 iPhone 和 Mac 的 Objective-C。
你如何在 objective-c 中的方法之间发送“数据集”。例如,在 C# 中,可以使用数据填充自定义类,并在自定义类类型的 List 中传递它。 例如,如果你有一个客户类,你可以做这样的事情:
List<Customer> customers = DataLayer.GetAllCustomers();
我可以看到如何在 obj-c 中完成此操作的唯一方法是使用自定义对象填充 NSArray?这是一种有效的做事方式吗?还有其他建议吗?我使用sqlite作为我要返回的数据库/数据。
答:
你走在正确的轨道上。
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,您不会“获得所有客户”,然后传递该集合。相反,您可以查询您关心的客户,当您遍历所查询对象的关系时,将自动为您拉取其他对象。
Core Data 还为您提供了一些功能,例如实体的可视化建模、自动生成属性 getter 和 setter、对从一个模式版本到另一个模式版本的迁移进行细粒度控制等等。
评论