2015-06-02 26 views
0

如何在for循环内调用Web服务?我有两个Web服务。首先,我调用一个Web服务并返回一些数据(名称,用户ID等)。我使用这个用户标识来调用下一个服务。我想在一个卷轴中显示所有骆驼数据(例如,两头骆驼都有这么多照片和视频),并且我想列出新卷轴视图内的所有图像和视频。如何在forloop中调用web服务?

我的代码我向您展示如下:

-(void)listiingNewCamels 
{ 
    int numberOfCamels = [msgArray count]; 
    for (int i = 0; i < numberOfCamels; i++) 
    { 
     camObject=(IZCamelObject *)[msgArray objectAtIndex:i]; 
     CGFloat yOrigin = i * 395; 
     UIView*mySampleview = [[UIView alloc] initWithFrame:CGRectMake(34,yOrigin+20,702,365)]; 
     mySamplev.backgroundColor=[UIColor redColor]; 
     camelIDStr=camObject.CamelID; 

     UIScrollView *myCamelImagesScroll=[[UIScrollView alloc]initWithFrame:CGRectMake(34,30,640,180)]; 
     myCamelImagesScroll.backgroundColor=[UIColor greenColor]; 
     [mySampleview addSubview:myCamelImagesScroll]; 
     [_camelListingScrol mySampleview]; 
    } 
    _camelListingScrol.contentSize = CGSizeMake(395, numberOfCamels * 400); 
} 

回答

1

Web服务调用可能需要几秒钟每次调用来完成,甚至更长的时间,如果连接速度慢或服务器没有立即回应。

不能同时使用GUI代码和同步代码很慢在一起,例如,假设你的循环是这样的伪代码:

for (int i = 0; i < numberOfCamels; i++) 
{ 
    get camel info from camObject 
    make synchronous web service call 1 
    make synchronous web service call 2 
    create scroll view 
} 

假设每个Web服务调用需要2秒,你有10个这意味着骆驼循环完成需要20秒。您的应用程序GUI将挂起20秒,用户将无法使用它。

因此,您必须使Web服务调用异步,并且还必须决定如何相应地设计程序。

如何做到这一点取决于您,您可以做的一件事就是立即使用IZCamelObject中的骆驼信息绘制滚动视图,并在每个Web服务调用完成后更新滚动视图。

或者当应用程序启动您的模型(您知道MVC?)立即开始进行Web服务调用,以便当您的GUI滚动视图调用骆驼数据的模型时它已经(或大部分)下载。

您的思维方式以及您的程序设计需要从同步改为异步。在找到解决方案之前,您需要先决定如何处理异步数据下载。

GUI代码不应该调用Web服务,这应该是模型组件的责任,而是为了说明以异步方式更新滚动视图的概念,它可能是这样的伪代码:

create scroll view 
    for (int i = 0; i < numberOfCamels; i++) 
    { 
     get camel info from camObject 
     add a subview with info from camObject 
     make asynchronous web service call 1 with completion block: {update subview with data from web service call 1} 
     make asynchronous web service call 2 with completion block: {update subview with data from web service call 2 
    }