0

我正在使用 SOAP WebService 并使用 for 循环来循环我收到的帐户。

在每个循环中,我都会向 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 个响应,因此有时它会相互贡献,因为服务器有点慢.

有人帮忙吗??

4

1 回答 1

1

我同意这些评论......你有一个架构问题。

不要这样做:

你正在尝试做我在这里描述的事情:

而是这样做:

你应该做的是这样的:

1 所以首先你知道有多少个账户,所以保留这些信息。

2 创建一个队列并将其限制为 3 个操作

3 观察您的队列以了解它何时完成处理计数

4 现在循环您的帐户,将操作添加到您的队列

注意:您可以使用 GCD,但这更适合您需要做的事情

5 您可以将 NSOperation 子类化以将信息返回到您的主队列

注意:相反,您可以将此方法与 NSURLConnection 一起使用

(sendAsynchronousRequest:queue:completionHandler:)

6 在观察队列的函数中,当您达到计数时...

A Kill the queue

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

祝你好运!

于 2013-02-04T13:30:06.787 回答