2009-12-07 67 views
0

我在我的應用程序中使用了大量非常小的網絡服務,並且我已經倒了幾條不按比例縮放或工作的道路。在NSThreaded設計中的授權? (iPhone)

設計方法我在想: viewController的任務是從一般的webServicesClass中請求一組數據,這個任務是在一個新的NSThread中啓動的 - >這將實例化一個對象,該對象只檢索xml並將其返回到webServicesClass - > webServicesClass現在實例化一個對象,該對象完全可以解析來自此特定Web服務的一些XML。解析器然後返回一個很好的實體對象到webServiceClass。 WebserviceClass現在需要通知viewController這些數據。

的的viewController實現webServiceClassDelegate和一些委託方法,看是否按計劃進行Web服務請求去了。例如 - (void)aWebserviceFailed和 - (void)aWebserviceSuccess。

0.5由於WebserviceClass運行的是不同的NSThread,它會調用父對象的主NSThread上的委託方法嗎?

1.0我覺得這個設計很合適,因爲它完全包含了Entity在不同類中的檢索,解析和返回。但是,對於每個不同的Web服務,我將不得不編寫委派方法並在每個步驟中實施委派協議。即從底部開始,WebserviceClass必須爲檢索XML的對象(開始,失敗,成功)以及解析XML的對象(開始,失敗,成功)實現委託方法,並且WebserviceClass必須能夠將這些響應中的每一個都委託給viewController,它再次必須從WebserviceClass實現委託方法(啓動,失敗,成功)。 有沒有更簡單的方法來做到這一點?

我有一些設計模式的經驗,而不是從使用代表團,以便始終爲目的C.語言在AS3或Java我不得不事件,可以冒泡通過的對象,並告知誰在聽有關的變化。在我讀過的所有Objective Objective代碼中,我只看到了使用0.1%時間的NSNotifications(相當於AS3或Java'Event')。

我描述給我的東西,完全擴展許多Web服務,給我在這裏一個潛在的錯誤/異常發生的完全控制權,但它似乎是一個很大的代碼,即可獲得該鬆耦合的設計。

1.1或者我應該完全接受代表團的做法,開始工作:)

感謝任何指針或幫助給出。我不是要求源代碼或喜歡,更多的是「你剛纔所描述的在每一天的情況Objective C的這被認爲是最佳實踐」 :)

回答

1

我建議考慮看看ASIHttpRequest(獲得here)和NSOperation + NSOperationQueue(docs here)。我不認爲你應該長時間運行一個線程來跟你的web服務通話,除非你絕對需要一個連接。

基本上ASIHttpRequest和的NSOperation都封裝聯網和線程的東西的一切。操作使iPhone上的多線程真的很棒。從本質上講,您可以創建一個操作(通過工廠或便於使用的操作),將其放入隊列中並對結果進行處理。

至於你,結果做什麼(這適用於原來的場景也和0.5和1.1)什麼通常的情況是你的操作/線程然後再打一個didSucceedAtGettingWhateverdidFailWithError:(NSError*)方法。代表團幾乎是事實上在手機上發出請求的方式。如果有多個代表,那麼你可以像使用Java一樣使用主題觀察者。

至於1.0,最終沒有。我們通常做的是我們有一個OperationDelegate和OperationTypes。基於哪種OperationType成功或完成,我們有不同的邏輯。這不是最好的,有很多不同的方式來做這件事,但不管你做什麼,你都必須有單獨的事件邏輯。無論是用一種方法還是多種方法都取決於你。

+0

非常感謝您Malaxeur! 寫下像我這樣的問題總是很健康,當我這樣做時,我得到了一些見解,我幾乎沒有點擊「發佈」。現在我很高興我做到了。 在閱讀ASIHTTPRequest文檔時,我也想到了提供同步和異步請求方法的庫。 使用委託的要點僅在處理異步代碼時相關。如果我已經在單獨的NSThread中將所有東西分散出來,則不需要將所有子例程拆分爲線程。所以我的getData和ParseData應該直接返回我的值。 – RickiG 2009-12-07 15:17:01

+0

如果出現問題,我不在乎它是否異步發生,我只需要通知'upwards'它出錯了。 WebserviceClass將獲得大量的邏輯,但是在Factory類型的設計中,它只會考慮每個可能的結果並返回適合此場景的對象。 現在感覺好多了,謝謝:) – RickiG 2009-12-07 15:19:43