2012-03-21 92 views
0

點擊一個按鈕後,我打電話給一個Web服務,之後我推送一個UIViewController。我的UIViewController應該加載從Web服務獲得的數據。但是目前,在我的網絡服務被調用之前,UIViewController正在被推送。我可以做些什麼來確保我的UIViewController在所有Web服務調用和數據檢索之前都未加載。只有在調用所有Web服務後才執行一段代碼

這是我使用的代碼。

MyWebService *webservice = [MyWebService myWebService]; 
webservice.delegate = self; 
[webservice getMyDataWithMyNumber:mySharedNumber myOldNumber:temp]; 
[webservice getvDetailsWithmyData:myData myNumber:myNumber]; 

MyViewController *myViewController = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil]; 
[self.navigationController pushViewController: myViewController animated:YES]; 
[myViewController release]; 

編輯:UIViewController只有在兩個Web服務被調用後才應該推送。 我正在將一個數組傳遞給新的UIViewController。數組對象在Web服務調用期間添加。我無法找到一種方法來做到這一點。需要幫忙。謝謝。

回答

2

您的Web服務在完成時需要回調視圖控制器。

這通常是使用委託模式完成的,但您可以使用其他技術。

您的第一個視圖控制器將自己作爲委託傳遞給MyWebService。 MyWebService做它需要做的事情,當它完成時,它調用它的委託視圖控制器上的一個方法。

在此回調方法中,您可以再推下一個視圖控制器。

您還應該考慮用戶體驗。用戶需要一個響應式設備,或者至少有一些跡象表明發生了某些事情。所以當調用Web服務時,顯示一個加載指示器。或者,立即推入下一個視圖控制器,然後從下一個視圖控制器的viewWillAppear方法調用Web服務(再次顯示某種加載反饋)。

..我只是重新閱讀,並注意到有更多。您有多個獨立的Web服務調用。那兩個總是一起叫?你可以在每個返回時使用一個bool標誌,並且只有在兩者都返回時纔會推送。我寧願直接推新視圖控制器,加載它們並讓它們獨立返回到新視圖控制器。

與實例

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated] 
    MyWebService *webservice = [MyWebService myWebService]; 
    webservice.delegate = self; 
    [webservice getMyDataWithMyNumber:mySharedNumber myOldNumber:temp]; 
    [webservice getvDetailsWithmyData:myData SmartJoinderNumber:myNumber]; 
    //assume internally these web service calls aggregate into one response 
} 

- (void) myWebService:(MyWebService *)webService didRespondWith:(NSData *)data { 
    MyViewController *myViewController = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil]; 
    [self.navigationController pushViewController: myViewController animated:YES]; 
    [myViewController release]; 
} 
+0

修訂我不熟悉代表團模式。你可以挑起一些例子或鏈接。 – 2012-03-21 18:07:15

+0

閱讀Cocoa基礎指南中的部分:https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/TP40002974-CH7 -SW18 – bandejapaisa 2012-03-21 18:53:11

+0

我不明白如何使用委託將確保所有其他代碼只有在Web服務調用完成後纔會執行。 – 2012-03-21 19:02:08

1
In your case, Apple has recommended to use delegate pattern. 

Here's an answer about delegate, that might help you to understand delegate concepts: 
http://stackoverflow.com/questions/1089737/parsing-xml-in-cocoa/1090170#1090170 
+0

我正在使用gdatdaxml解析器。你能否提供一個更有用的鏈接?謝謝 – 2012-03-21 18:39:58

+1

我認爲,在你的情況下使用委託模式。如果你想知道如何委派工作,然後讓我知道。 – Invincible 2012-03-22 14:55:53

+0

是的。我想知道。 – 2012-03-22 15:02:06

相關問題