Недавно я столкнулся с той же проблемой. Я не изучил Three20 достаточно глубоко, чтобы понять, предназначена ли повторная попытка неудачных запросов, но я нашел проблему и надежное (и простое) исправление.
После повторного вызова [request send] экземпляр TTURLRequest освобождается до завершения загрузки. Если вы посмотрите на TTURLRequestModel.m в Three20Network, то увидите, что последний запрос модели (_loadingRequest) освобождается до сохранения нового запроса. Если последний запрос совпадает с новым запросом (как и в вашем случае), то его счетчик сохранения возвращается к 0, и он получает dealloc'd:
/////////////////////////////////////////////////////////////////////////////
- (void)requestDidStartLoad:(TTURLRequest*)request {
[_loadingRequest release];
_loadingRequest = [request retain];
[self didStartLoad];
}
Я решил эту проблему, создав подкласс TTURLRequestModel.m и переопределив этот метод следующим образом:
/////////////////////////////////////////////////////////////////////////////////
- (void)requestDidStartLoad:(TTURLRequest*)request {
[request retain];
[_loadingRequest release];
_loadingRequest = request;
[self didStartLoad];
}
Это сработало в моем тестировании и, похоже, ни на что не должно отрицательно повлиять.
Примечание : Если вы используете TTURLJSONResponse для объекта ответа вашего запроса, вам нужно будет выделить новый экземпляр и установить его для request.response перед повторным вызовом send. Если вы посмотрите на TTURLJSONResponse.m в extThree20JSON, то увидите, что метод processResponse утверждает (nil == _rootObject). Это не удастся, если экземпляр ответа ранее использовался в запросе.