我的應用允許人們通過Facebook,Twitter,電子郵件和短信共享他們創建的內容片段。每個選項都有相應的UISwitch。用戶配置所有開關,然後按下「完成」按鈕。對於每個開關,如果設置爲「開」,我就會觸發一個適當的方法(shareViaSms
,shareViaEmail
等),它實例化本地iOS viewControllers以完成該類型的共享(TWTweetComposeViewController,MFMailComposeViewController等)。這些viewControllers有委託回調來表示完成,當完成時(有人發送或取消電子郵件撰寫表),我需要關閉他們想要使用的下一個。創建通過代理回調完成的任務隊列
我目前的代碼管理這感覺kludgy,我正在尋求更好的解決方案。如果用戶打開所有4個選項,我打電話給第一個共享方法shareViaFacebook.
它有一個委託方法,在完成時,我檢查下一個共享選項的UISwitch狀態,如果它打開,則調用它的共享方法,如果不是,檢查下一個開關,依此類推等等。每個委託的完成方法循環遍歷剩餘的開關,並負責調用下一個共享方法。正如你所想象的,添加一個新選項需要改變很多代碼並修改許多if/else條件。
我該如何改進?我希望能夠簡單地查看所有UISwitch,並且如果設置爲「ON」,則將我的相應共享方法(shareViaSMS
)添加到某個隊列中,然後讓該隊列運行並在下一次時自動調用下一個共享方法前一個完成。我很掙扎,因爲如前所述,完成是異步的,並通過委託回調進行宣告。
這一切都非常有意義。兩個問題雖然。 1)當你說「委託人應該在管理者內部調用一種方法」時,你是指相應的股票期權的每個代表?像MFMailComposeDelegate和MFMessageComposeDelegate? 2)當我所有的邏輯現在封裝在管理器對象中時,如何將viewController(如MFMailComposeViewController)推送到堆棧上。我認爲你只能從現有的viewController中推送新的viewController。我的經理應該保持對實例化它的viewController的引用嗎? – djibouti33
對於你的第一個問題是,每個份額選項都有自己的回調函數,這個回調函數應該調用管理器對象,以便隊列可以繼續。對於你的第二個問題,你所說的似乎是最好的解決方案,它取決於你執行的任務。如果需要提供新的控制器,那麼管理員必須提供一個將顯示它的VC。 – Pochi