2008-08-27 46 views
8

這是一個讓我思索最後一段時間的問題。我主要是一個.NET開發人員,他在Objective-C中爲iPhone和Mac開發。傳遞數據集

你如何去在Objective-C中的方法之間發送「數據集」。例如在C#中,您可以使用數據填充自定義類,並在類型自定義類的List中傳遞它。例如,如果你有一個客戶類,你只想做這樣的事情:

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

我可以看到這是如何在OBJ-C做的唯一方法是填充一個NSArray與自定義對象?這是一種有效的做事方式嗎?還有其他建議嗎?我正在使用sqlite作爲我想返回的數據庫/數據。

+0

此外,您可能希望查看SQLLite周圍的輕量級包裝,以便從數據庫更容易地創建對象。 – 2008-09-15 05:50:29

回答

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/etc中使用的「數據集」模式的替代方案。使用核心數據,您不會「獲取所有客戶」,然後通過該收集。相反,您可以查詢您關心的客戶,並且在您遍歷所查詢對象的關係時,其他對象將自動被拉入。

核心數據還爲您提供了像實體的可視化建模,屬性獲取器的自動生成,對從一個模式版本到另一個模式版本的遷移的細粒度控制等功能。