2014-02-12 95 views
2

我有理論上的問題。實現UICollectionViewDataSource協議的最佳方式是什麼?

目前我的應用程序正在使用UICollectionView作爲顯示對象列表的方式。 UIViewController,其中包含UICollectionView作爲子視圖,實現UICollectionViewDelegate協議並充當委託和數據源。 Datasource使用NSFetchedResultsController來提供數據;

在我看來,這不是實現數據源的最好方法,並且在單獨的類中實現它看起來更好。但數據源的問題取決於UITextField中的搜索參數以及其他一些按鈕選擇,因此每次用戶在搜索字段中鍵入文本或按任意「排序」按鈕時,我都應更新數據源(尤其是NSFetchedResultsController中的fetchRequest)。

因此,最後,我的問題:是否有任何實現依賴於外部參數的數據源的「最佳實踐」?我應該爲現在的數據源創建單獨的數據源類嗎?如果實現數據源作爲單獨的類 - 我應該創建datasourcedelegate調用委託時更新數據源時的自制委託方法,或者有此問題的其他解決方法(我不考慮使用通知數據源更新,因爲我的通知機制是更全球的解決方案,那麼我需要在這裏)?

我不是在尋找最快的方法,我只是想找出最理想的理論實現方式。

謝謝大家提前:)

回答

3

我個人實現了一個具體的NSObject派生類,它實現UICollectionViewDataSource以及NSFetchedResultsControllerDelegate,它實際上將獲取的結果控制器事件(對象插入,更新,刪除)轉換爲集合視圖事件(插入,更新或刪除單元格)。你可以找到如何做到這一點的例子,我從here我的,但我實現它作爲一個單獨的類,而不是收集視圖的類別。我發現我的課程具有高度的可重用性,實際上,我在所有需要在集合視圖中顯示託管對象的項目中都使用它。對於UITableViewDataSource也可以實施類似的類。

如果您需要使用搜索謂詞更新獲取請求,我會創建新創建的DataSource類的子類,然後添加邏輯以更新那裏的獲取請求。假設您添加-(void)updateSearchFilterWithText:(NSString*)text方法,您可以在其中添加更新提取結果控制器的提取請求的邏輯。不要忘記之後再次執行提取操作,並在收集視圖中調用reloadData

有了這個架構,視圖控制器擁有這個dataSource對象。每次用戶更新其中一個過濾文本字段(或其他窗口小部件)時,視圖控制器將調用您的數據源對象的updateSearchFilterWithText:,其餘工作將在稍後完成。

2

什麼你現在已經是標準的做法。雖然沒有確定的「最佳」方法,但您所描述的確實是一種更好的方法。

你的視圖控制器將擁有你的新數據源類的一個實例,並且它本身很可能處理委託方法(因爲這些是要採取的動作而不是數據提供的),所以當UI中的任何變化時,視圖控制器應該將這些更改推送到數據源。不需要額外的授權。

您不應該通過文本字段和按鈕直接驅動更改的想法來創建數據源。數據源應該呈現一個通用接口,您可以在其中更新要執行的獲取請求(覆蓋謂詞和排序),並更改單元格的配置方式(可能帶有塊)。通過這種方式,您可以將業務邏輯保留在視圖控制器中,並將可重用數據源代碼保留在可用於其他集合視圖/項目的其他類中。

相關問題