2014-07-09 45 views
6

我想弄清楚構建我的應用程序的最佳方法。我目前有一個圍繞CLLocationManager的包裝類,它將自己設置爲委託並處理我們需要的所有額外設置和業務邏輯。它也是一個單身(sharedManager)。在模型與控制器中使用CoreLocation的最佳做法

我希望儘可能真實地使用MVC,並將儘可能多的邏輯推入模型中,但我不確定最佳方式。目前,控制器和模型都獲得了sharedManager,並且在調用模式(控制器)或獲取當前位置之前,檢查位置是可用的,但在進行REST調用之前(模型),但這種感覺非常耦合且難以測試。

我想盡可能地使用依賴注入來避免不斷查詢我的代碼的所有部分中的單例方法,但我找不出最好的方法來做到這一點。

一些想法我有:

  • 轉換我CLLocationManager包裝使用通知聊到應用的各個部分,以提高脫鉤。然後,我可以使用單例進行開始/停止呼叫,但是我的控制器/模型通過收聽通知來響應更改。這仍然無法避免必須在整個地方使用單身人士。

  • 只能在控制器中使用單例並通過設置屬性將所需的位置數據傳遞給模型。這感覺會讓我的模型更容易測試,但不是我的控制器,並且將Core位置代碼放在控制器中也會感到噁心。

  • 我可以通過設置屬性在模型和控制器上傳遞我的自定義位置管理器包裝的實例,但這感覺有點繁瑣,並且仍然存在問題,我在哪裏創建初始管理器?

我很想深入瞭解這個問題的人的一些建議。所有的想法都歡迎和讚賞!

+0

我的方法是保持CLLocationManager包裝器,創建一個額外的類來管理儘可能多的邏輯,儘量保持控制器儘可能簡單並使用屬性設置數據。我也會在適當的情況下使用通知,以避免過多的耦合,但如果沒有應用程序需求,很難更具體。希望這可以幫助。 – mxb

回答

2

我想盡可能地使用依賴注入來避免不斷查詢我的代碼的所有部分中的單例方法,但我找不出最好的方法來做到這一點。

你回答你自己的問題:

我可以在這兩種模式和控制器設置屬性周圍通過我的自定義位置管理器包裝的實例,但感覺有點乏味和劇照留下一個問題至於我在哪裏創建初始經理?

有什麼不對讓你的包裝一個單,繞過對它的引用到需要它的對象 - 這是處理依賴注入的一種方式。你可以有很多對象依賴於它的接口,但是如果你想退出它作爲一個單身人士,你也可以做到這一點。

您的模型不必知道您的位置管理器是單身人士。也許只有你的控制器可以。或者,您可以在應用程序中選擇一個或幾個根位置,以瞭解位置管理器的單例本質,並將其注入到相關組件。你想如何做到這一點很大程度上取決於你現有的應用程序架構。你可以爲它創建一個「finder」(使它像一個單例一樣),或者將它作爲參數傳遞給構造函數 - 這是一種有時被忽視的依賴注入方法。

我也建議看看Key Value Observing,也許你的模型或控制器觀察位置管理器上的位置屬性。我個人也喜歡使用Reactive Cocoa作爲「KVO with blocks」庫,而不必一頭扎進Functional Reactive Programming。 ReactiveCocoa可以節省很多與Objective-C中非常強大的KVO系統相關的headaches

我不會主張使用通知來傳遞像單個位置這樣的核心變更。這樣我的事情變得非常混亂。 Objective-C程序中的一種常見模式是「消息 - 向後轉發/通知 - 應用」。

你在位置管理器包裝中有什麼本質上是位置服務。將許多業務邏輯放在這些服務中而不是放在模型中是有道理的。例如,如果您在傳播到UI更改的位置更改頻率或移動閾值周圍具有業務邏輯,則這些可能適用於各種不同的模型。在位置服務中擁有共同的位置相關業務邏輯可以真正幹你的模型。

相關問題