Порядок запросов в ASIHTTPRequest - PullRequest
0 голосов
/ 11 августа 2011

Я использую ASIHTTPRequest для загрузки некоторых данных.

У меня есть следующее в методе:

// Request 1
request1.tag = 1;
[request1 setDelegate:self];
[request startAsynchronous];

// Request 2
request2.tag = 2;
[request2 setDelegate:self];
[request2 startAsynchronous];

// Call third request method
[self callThirdRequest];

Теперь из callThirdRequest я собираю некоторые данные, которые былискачал с request2 и там я звоню startAsynchronous.Причина, по которой у меня есть вызов третьего запроса в отдельном методе, заключается в том, что он будет вызван более одного раза.После установки некоторых выходов консоли, кажется, что callThirdRequest вызывается до того, как request2 начинает его загрузку.Поэтому, когда callThirdRequest пытается получить некоторые данные, которые должны были быть загружены request2, это не работает, поскольку данных нет.

Почему это так?Как я могу убедиться, что callThirdRequest вызывается только после завершения загрузки request2? 1017 *

Спасибо,

Ответы [ 3 ]

2 голосов
/ 11 августа 2011

Когда запрос выполняется асинхронно, остальная часть вашего кода будет продолжаться в то же время. Ваши первые два запроса делают именно это. У вас есть два варианта.

Вы можете запустить второй запрос синхронно. (Не очень хорошая идея, поскольку ваше приложение будет отображаться «замороженным» до завершения второго запроса. Кроме того, использование этого метода не поможет вам, если второй запрос в вашем списке из трех завершится неудачей.)

Гораздо лучшая идея - использовать методы обратного вызова делегата. Это лучший способ справиться с этим по двум причинам. Прежде всего, вы можете правильно обрабатывать неудачные запросы, а также правильно обрабатывать успешные запросы. Юй хочет что-то вроде этого:

// Request 2
request2.tag = 2;
[request2 setDelegate:self];
[request2 startAsynchronous];



- (void)requestFinished:(ASIHTTPRequest *)request{
   if(request.tag == 2){
     [self callThirdRequest];
   }
}

Убедитесь, что проверили запрос в обратном вызове делегата, чтобы убедиться, что он «второй», чтобы в конечном итоге вы не запустили неправильное действие в неподходящее время. В этом случае я использовал свойство запроса «tag». Если бы вы сохранили запрос как собственность вашего класса, вы можете просто проверить это.

1 голос
/ 11 августа 2011

Причина - startAsynchronous.Асинхронный вызов будет работать в другом потоке.Вам нужно установить делегата на request2, а затем вызвать третий запрос, когда request2 будет завершен.

    // Request 2
    request2.tag = 2;
    [request2 setDelegate:self];
    [request2 startAsynchronous];

...

- (void)requestFinished:(ASIHTTPRequest *)request
{
    [self callThirdRequest];
}
1 голос
/ 11 августа 2011

Это потому, что request2 работает асинхронно. Вам следует запустить третий запрос в методе request-did-finish-Delegate-метода request2!

...