传递数据集

Passing around sets of data

提问人:JamesSugrue 提问时间:8/28/2008 最后编辑:Jonathan HallJamesSugrue 更新时间:7/17/2017 访问量:2950

问:

这个问题困扰了我一段时间。我主要是一名 .net 开发人员,涉足 iPhone 和 Mac 的 Objective-C。

你如何在 objective-c 中的方法之间发送“数据集”。例如,在 C# 中,可以使用数据填充自定义类,并在自定义类类型的 List 中传递它。 例如,如果你有一个客户类,你可以做这样的事情:

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

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

Objective-C Cocoa macOS SQLite

评论

0赞 Kendall Helmstetter Gelner 9/15/2008
此外,您可能希望围绕 SQLLite 寻找轻量级包装器,以便更轻松地从数据库创建对象。

答:

25赞 Chris Hanson 8/28/2008 #1

你走在正确的轨道上。

Cocoa 的集合类(它们都有可变和不可变的变体)是:

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

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

// 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、对从一个模式版本到另一个模式版本的迁移进行细粒度控制等等。