2015-04-17 44 views
1

比方說,我有一個NSTableView,它目前正在使用從Core Data中提取數據的NSArrayController。從兩種不同的數據源中流行表格視圖的最佳方式是什麼?一種是本地核心數據,另一種是遠程web服務調用。將NSTableView綁定到兩個不同數據源的最佳方法?

我想要實現的是Spotlight風格的結果表,當遠程Web服務調用來自核心數據和遠程匹配時,用戶類型將顯示即時本地匹配。

我是Cocoa的新手,來自iOS背景,所以NSArrayControllers對我來說是新手。

是否可以實現NSArrayController的子類化,並且可以以某種方式實現此目的,還是有更傳統的方法,只使用NSTableView.datasource協議並將它們粘貼在View Controller中。

回答

3

NSArrayController只是一個便利的控制器,可以觀察某些數組的變化並更新UI(反之亦然)。你真正要問的是「如何創建從核心數據存儲檢索的匹配組合數組以及外部來源?」。當你這樣說時,解決方案變得更加明顯。

雖然對於簡單情況很方便,但直接連接到獲取請求的NSArrayController在您走出「簡單」之外時相當笨拙。現在讓我們忽略數組控制器,因爲這實際上是兩個單獨的問題(管理由兩個不同源構建的集合,並將數組控制器與數組一起使用,或將您自己管理與表數據源進行管理)。

假設您在某個名爲results的控制器上擁有一個物業,作爲NSMutableArray。爲了建立你的結果,你要結合兩個操作:1)自己創建和執行一個NSFetchRequest,2)創建和執行一些網絡操作。我不打算詳細介紹這兩種操作中的任何一種,因爲有關於這些方法的大量寶貴的信息來源,但它確實非常簡單,只需將兩組結果合併到results陣列中即可。

至於數組控制器(如果這是你想要的方式),它所做的只是提供一個簡單的方法來使用Cocoa Bindings通過控制器(本身)將你的UI綁定到你的模型(results數組)。而已。它有兩種模式:通過針對託管對象上下文(即「核心數據模式」)執行的獲取請求,管理指定類的集合(在這種情況下爲NSMutableArray)和來自託管對象模型的實體集合)。由於您的意思是自己管理集合,「核心數據模式」不適用於您。你想配置它來管理一個可變數組,並且根本不使用實體/ MOC /提取請求(因爲你將自己管理那個位)。這裏的技巧是避免「更改陣列控制器背後的陣列」,並確保通過陣列控制器的方法向陣列添加對象或從對象陣列中刪除對象,因此它知道陣列內容已更改,並且可以更新/排序/等等。

但是,正如您懷疑的那樣,您也可以完全跳過陣列控制器,只使用NSTableViewDataSource協議。這種方法不僅沒有問題,而且在處理像您這樣的自定義案例時,它在很多方面都非常出衆。當然,你必須管理選擇的變化(通過協議)以及維護排序,但是當你考慮到你的收集的控制級別時,這些都是很微不足道的事情。您甚至可以輕鬆地管理集合中的「組標題」標記,並使用適當的委託方法使用漂亮的浮動標題行將表中的「本地」與「遠程」分開。

我希望這會有所幫助。

+0

很好的答覆,我基本上得出了同樣的結論。我只是想知道是否有更多的可可方式來做到這一點。我只是要走NSTableViewDataSource的路線,並將兩個NSArrays組合成單個數據集。我會做我自己的NSFetchRequests而不是使用任何NSArrayController。我失去了綁定的使用,但我認爲它會更容易。 – Camsoft

+0

它比可可更多,因爲它是多年來唯一的方式。 ;-) –

+0

來自iOS世界的技巧很棘手,因爲在Cocoa中似乎有很多遺留問題,這些遺留問題一直困擾着我。不太確定最佳實踐是什麼。 – Camsoft

相關問題