2013-01-23 43 views
0

我的應用允許人們通過Facebook,Twitter,電子郵件和短信共享他們創建的內容片段。每個選項都有相應的UISwitch。用戶配置所有開關,然後按下「完成」按鈕。對於每個開關,如果設置爲「開」,我就會觸發一個適當的方法(shareViaSms,shareViaEmail等),它實例化本地iOS viewControllers以完成該類型的共享(TWTweetComposeViewController,MFMailComposeViewController等)。這些viewControllers有委託回調來表示完成,當完成時(有人發送或取消電子郵件撰寫表),我需要關閉他們想要使用的下一個。創建通過代理回調完成的任務隊列

我目前的代碼管理這感覺kludgy,我正在尋求更好的解決方案。如果用戶打開所有4個選項,我打電話給第一個共享方法shareViaFacebook.它有一個委託方法,在完成時,我檢查下一個共享選項的UISwitch狀態,如果它打開,則調用它的共享方法,如果不是,檢查下一個開關,依此類推等等。每個委託的完成方法循環遍歷剩餘的開關,並負責調用下一個共享方法。正如你所想象的,添加一個新選項需要改變很多代碼並修改許多if/else條件。

我該如何改進?我希望能夠簡單地查看所有UISwitch,並且如果設置爲「ON」,則將我的相應共享方法(shareViaSMS)添加到某個隊列中,然後讓該隊列運行並在下一次時自動調用下一個共享方法前一個完成。我很掙扎,因爲如前所述,完成是異步的,並通過委託回調進行宣告。

回答

1

您需要一個「管理員」對象來接受一個「請求」對象,該對象將包含啓動您想要的特定請求(服務名稱,文本,標題等)的所有必要信息。

「manager」對象包含一個任務數組,它將使用請求對象加載,並且必須使用遞歸性,方法是使用委託並在完成後立即彈出請求。

的委託應該調用哪個不喜歡的東西經理裏面的方法:如果請求成功完成

,彈出堆棧的頂部,並再次呼籲經理的堆棧請求方法的執行上面。

如果請求失敗,請停止併發送消息。

如果堆棧爲空,則所有請求都已執行。

當然,您的經理必須有適當的代碼來處理每種類型的請求。

如果您有這種體系結構,添加新服務就像添加代碼來管理該類型的請求到管理器對象一樣簡單。

順便說一句,這是你可以創建一個隊列的很多方法之一,我建議這一個,因爲它是獨立於語言的,並且在我看來很容易理解。

+0

這一切都非常有意義。兩個問題雖然。 1)當你說「委託人應該在管理者內部調用一種方法」時,你是指相應的股票期權的每個代表?像MFMailComposeDelegate和MFMessageComposeDelegate? 2)當我所有的邏輯現在封裝在管理器對象中時,如何將viewController(如MFMailComposeViewController)推送到堆棧上。我認爲你只能從現有的viewController中推送新的viewController。我的經理應該保持對實例化它的viewController的引用嗎? – djibouti33

+0

對於你的第一個問題是,每個份額選項都有自己的回調函數,這個回調函數應該調用管理器對象,以便隊列可以繼續。對於你的第二個問題,你所說的似乎是最好的解決方案,它取決於你執行的任務。如果需要提供新的控制器,那麼管理員必須提供一個將顯示它的VC。 – Pochi