2012-03-21 150 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

相关问题