2014-10-22 1 views
2

NSURLConnection에 문제가있어서 해결책을 찾기 위해 3 일 이상을 보냈습니다. 하지만 불행히도, 나는 하나도 얻지 못했습니다. 여기 내 코드는,이 전용 클래스이며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]; 
    } 

을 반환하고 데이터를 수신 할 대리자를 사용하기는 completeHandler를 사용, 그것은 "didReceiveData", "didFailWithError", "connectionDidFinishLoading" "didReceiveResponse"에서 잘 작동 ...

하지만 요청 제한 시간 앞으로 일어날이 경우,
다음 (내가 이미했다 "didFailWithError"에서 [CONN 취소), 시간의 peroid를에 (나는 정확한 수를 할 수 있지만, 약 1 않았다 min) 동일한 서버 (요청)에 대한 모든 새로운 요청은 몇 번이고 다시 시도됩니다.
내가 잘못 했습니까?
아니면 코드를 수정해야합니까?
많은 솔루션을 사용해 왔지만 여전히 문제가 없습니다.
그래서, 도움을 찾고, 감사.

+0

서버에 연결하는 데 문제가 없는지 확인하십시오. 네트워크 또는 연결하려는 서버에 문제가있을 수 있습니다. 요청 시간이 초과되면 동일한 요청을 다시 시도하는 데 1 분 이상 기다려야 할 수 있습니다. –

답변

1

하나의 공통적 인 문제는 많은 수의 NSURLConnection 요청을 시작하면 동시에 특정 숫자 (보통 4 또는 5) 만 실행할 수 있다는 것입니다. 따라서 그 이상을 시작하면 한 번에 몇 개만 실행할 수 있으며 다른 모든 슬롯은 백 로그됩니다. 슬롯 중 하나가 사용 가능할 때까지 대기합니다. 슬프게도, 1 분 이상 걸리면 후자의 요청이 시간 초과 될 수 있습니다.

NSURLConnectionNSOperation 하위 클래스의 객체를 래핑하는 것이 하나의 해결책입니다. 연결을 한꺼번에 시작하는 것보다 먼저 NSOperationQueue에 연결을 추가하여 작업 대기열에서 시작 시점을 결정하게 할 수 있습니다. 따라서 대기열의 maxConcurrentOperationCount을 4 또는 5로 정의하면 작업 대기열이 동시에 모든 대기열을 시작하지 않으므로 NSURLConnection 제한 시간 문제를 해결할 수 있습니다.

동시 작업을 위해 NSOperation의 하위 클래스를 만드는 방법에 대한 배경은 의 동시 실행을위한 작업 구성 섹션을 참조하십시오. NSOperation 하위 클래스에 NSURLConnection 개체를 래핑하는 데 대한 설명은 https://stackoverflow.com/a/24943851/1271826을 참조하십시오.

여기에서 세부 정보를 놓치지 않으려면 작업 대기열 솔루션 (AFHTTPRequestOperationManager 이상)을 사용하는 AFNetworking을 사용하는 것이 좋습니다. 관리자의 작업 대기열의 maxConcurrentOperationCount을 4로 설정하면 네트워크 작업을 원하는만큼 추가 할 수 있으며 작업 대기열은 시간 초과되지 않도록합니다.