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 に答える