2015-06-02 117 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 
    }