2013-02-04 93 views
0

我正在使用SOAP WebService,並使用for循環來循環接收的帳戶。如何停止for循環並執行另一個方法,然後返回以繼續使用objective-c?

在每一個循環中,我調用WebService的另一個請求,所以我需要的是在發出請求時在for循環中,去獲取響應,然後繼續循環。

下面是for循環的代碼:

for (A2AWCAccount* account in accountList.Accounts) { 
     [_internalAccounts addObject:[[AccountDO alloc] initWithAccountName:[account localizedDescription] AccountNumber:account.Number Balance:[account.CurBal doubleValue] Currency:account.Curr]]; 

     DataBank* dataBank = [DataBank getInstace]; 

     A2AService* service = [A2AService service]; 
     service.logging = YES; 

     A2AWCListCard* accountList = [A2AWCListCard alloc]; 
     accountList.CustMnemonic = dataBank.customerId; 
     accountList.SessionID = dataBank.sessionId; 
     accountList.AccountNumber = account.Number; 
     accountList.Type = @"V"; 

     // here i make the request 
    [service wrListCard:self listCard:accountList]; 
} 

這裏是該得到的迴應

- (void) onload:(id)value { 
if ([value isKindOfClass:[A2AWCListCard class]]) { 
    A2AWCListCard* obj = (A2AWCListCard*) value; 
    if (obj.ErrorCode != 0) { 
     if (obj.ErrorCode == 109) { 
      [self handleSessionError]; 
      return; 
     }else if (obj.ErrorCode == 116) 
     { 
      UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Info", @"Info") message:[obj localizedError] delegate:self cancelButtonTitle:NSLocalizedString(@"Ok", @"Ok") otherButtonTitles:nil, nil]; 
      alert.tag = 5; 
      [alert show]; 
      return; 
     } 
     [self handleRequestError:[obj localizedError] closeView:YES]; 
     return; 
    } 

    for (A2AWCCard* account in obj.Cards) { 
     [_cards addObject:[[CardDO alloc] initWithCardNumber:account.CardNo balance:[account.CurBal doubleValue] minimumPayment:account.CardAcc currencyCode:account.Status status:account.Curr cardName:[account localizedDescription] cardNo:account.Number]]; 
     _totalBalance += [account.CurBal doubleValue]; 

    } 

    [cardsPicker setNeedsDisplay]; 
    [cardsPicker reloadAllComponents]; 

    _servicesInitialized = YES; 
} 
} 

的問題發生在這裏的是,循環使其調用該方法的代碼N次取決於帳戶的數量,例如如果有3個帳戶,它會發出3次請求,然後我等待3次響應,所以它有助於彼此,有時是因爲服務器有點慢。

請幫助嗎?

+0

這些調用是在主線程上執行的嗎? – trojanfoe

+0

我不知道,但我認爲是它的主線程,因爲它沒有設置爲任何其他線程 –

+0

不會阻止主(UI)線程很長一段時間? '[服務wrListCard:self listCard:accountList];'如何實現? – trojanfoe

回答

1

我同意評論......你有一個架構問題。

不要這樣做:

You are trying to do what I depicted here:

而是做到這一點:

What you should do is like so:

1所以,首先你知道有多少賬戶,因此保持這一信息。

2創建隊列並限制它讓我們說3個操作

3觀察等待您知道當它完成處理計數

4現在循環您的帳戶添加操作到隊列

注意:您可以使用GCD,但這對您需要做的更好

5您可以繼承NSOperation以將信息返回到您的主隊列

注:隊列:相反,你可以用NSURLConnection的

(sendAsynchronousRequest使用此方法completionHandler :)

6在功能觀察隊列,當你打你的個性化......

A Kill the queue 

B Do something with the returned data, probably in some array 

祝你好運!

+0

我真的很感謝你的工作,對於NSOperationQueue有點新鮮,所以我初始化它並設置最大數量,但之後我不知道該怎麼辦,代碼是上面可以請你幫我一下! –

+0

我提到了以下方法(sendAsynchronousRequest:queue:completionHandler :),因爲第二個參數將採用您創建的隊列。一起玩吧,一旦你使用它並沒有那麼糟糕。噢,和塊一樣......一旦你掌握了它們,你就會愛上它們。 – Arvin

+0

好的,我會盡力讓它通知你,謝謝 –

相關問題