2014-10-22 3 views
2

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

NSURL *myUrl = [NSURL URLWithString:targetSite]; 
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:myUrl 
                   cachePolicy:NSURLRequestReloadIgnoringCacheData 
                  timeoutInterval:timeOutInterval]; 
    [urlRequest setHTTPMethod:@"POST"]; 
    [urlRequest setHTTPBody:MYBODYCONTENT]; 
    conn = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
    if(conn) 
    { 
     webData = [NSMutableData data]; 
    } 

и использовать делегат для получения данных, он отлично работает в «didReceiveResponse», «didReceiveData», «didFailWithError», «connectionDidFinishLoading» ...

нО, если запрос тайм-аут сЛУЧИЛОСЬ, (я уже сделал [сопп отменить] в «didFailWithError»)
затем, в пероид времени (я не делал точный подсчет, но около 1 мин) Весь мой новый запрос на тот же сервер (запрос снова) будет тайм-аутом снова и снова.
Есть ли что-нибудь, что я делаю неправильно?
Или что-нибудь, что я должен изменить в своем коде?
Я пробовал много решений, но все равно не пошел.
Итак, в поисках какой-то помощи, спасибо.

+0

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

ответ

1

Одна из распространенных проблем заключается в том, что если вы инициируете много запросов NSURLConnection, он может одновременно запускать определенное число (обычно 4 или 5). Таким образом, если вы инициируете больше, чем это, он может запускать только несколько из них за раз, а все остальные будут загружены, ожидая, пока один из слотов станет доступным. К сожалению, если это занимает больше минуты, последние запросы могут быть таймаутом.

Одним из решений этого является обертывание объектов NSURLConnection в пользовательском подклассе NSOperation. Затем вместо того, чтобы просто запускать соединения сразу, вы можете добавить их в NSOperationQueue, позволяя очереди операций решать, когда их запускать. Таким образом, если вы определяете, чтоочереди будет 4 или 5, тогда очередь операций не будет пытаться запускать их все одновременно, решая проблему таймаута NSURLConnection.

Историю о том, как подкласс NSOperation для одновременной работы, см Настройка операций для параллельного выполнения части Concurrency Programming Guide: Operation Queues. См. https://stackoverflow.com/a/24943851/1271826 для демонстрации обертывания NSURLConnection объектов в подклассе NSOperation.

Еще лучше, если вы не хотите заблудиться в деталях здесь, рассмотрите возможность использования AFNetworking, в котором используется решение очереди операций (по крайней мере, для AFHTTPRequestOperationManager). Просто не забудьте установитьочереди работы менеджера, а затем можно добавить столько сетевых операций, сколько необходимо, и очередь операций гарантирует, что они не будут таймаутом.

Смежные вопросы