2012-03-22 3 views
2

내 API에서 데이터를로드하는 데 다음 코드가 있습니다. 실제로 iOS 5에서는 훌륭하게 작동하지만 iOS 4에서는 상태 204와 함께 많은 응답을 얻고 있습니다.iOS 4에서 GCD 네트워크 요청이 실패했습니다.

이것은 iOS 4에서만 발생하며 API 오류로 간주 될 수 있지만 위대한 기능을합니다. 브라우저, iOS 5 등에서 Rested.app에 ... iOS 4가 실패하면 시뮬레이터와 장치 (iPhone 4)에서 오류가 발생합니다.

셀을 테이블 뷰에로드 할 때마다이 코드를 호출합니다. 로드 상태가있는 코어 데이터 객체가 있는데, 처음에는 아니요로 설정되어 있지 않으면이 코드를 수행하고,로드되면이 코드를 건너 뜁니다. 그 동안 테이블보기에서 셀 안에 스피너를 표시합니다.

가 나는

아이폰 OS 4의 GCD에 여러 요청에 문제의 확신 내 코드 잘못된 사람이 자리 아무것도 할 수 있습니까? cellForRowAtIndexPath : 내가있는 tableView에서이 방법을 호출 할 때

-(void)myFunction{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     // query users participations (Network) 

     NSError * _urlError = nil; 
     NSString * url = [NSString stringWithFormat:@"my api url"]; 
     NSMutableURLRequest * loginHTTPRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; 
     [loginHTTPRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 

     NSLog(@"Description: %@", [loginHTTPRequest description]); 

     NSHTTPURLResponse * _responseHeaders = nil; 
     NSData    * responseData  = [NSURLConnection sendSynchronousRequest:loginHTTPRequest 
                     returningResponse:&_responseHeaders 
                        error:&_urlError]; 
     if(_urlError != nil){ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       // alert network connection error 
      }); 
      return; 
     } 

     NSString *json_string = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

     SBJsonParser *parser = [[SBJsonParser alloc] init]; 
     NSDictionary * jsonData = [NSDictionary dictionaryWithDictionary:[parser objectWithString:json_string]]; 
     [json_string release]; 
     [parser release]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      // here [_responseHeaders statusCode] keeps returning 204 and there is nothing in responseData 

      // do some Core Data stuff 
     }); 

    }); 
} 

UPDATE도 반복 for 루프를 호출하면이 코드는 잘 작동

참고 문제가

을 내가 코어 데이터는이 "isLoaded"속성이 NO 인 객체는 원격로드시 YES로 변경됩니다. 내 tableview의 데이터 소스가 각 객체의 셀을로드 할 때 tableView : cellForRowAtIndexPath : 메서드는 객체의 "isLoaded"속성이 NO 인 경우이 함수를 호출합니다.

테이블을로드하고 다시로드 할 때 API에 대한 동시 호출이 두 개 이상 발생했기 때문에 문제가 발생한 것으로 생각됩니다. API에서 성공적으로로드 될 때마다 해당 테이블 뷰에 대해 reloadData가 호출됩니다.

이렇게하면 스피너가 미리 채워진 tableview가 있고 비동기식으로 내 데이터를로드 할 수 있습니다. 화면에 필요한만큼 효율적으로로드 할 수 있습니다. 왜냐하면 NSFetchedResultsController를 게으른로드로 내 개체 핵심 데이터를로드 할 수 있기 때문입니다.

(개체 ID의 배열을 반환하는 모든 개체에 대한 끝점이 있습니다 - ID, 모든 나머지 데이터, 이름, 날짜 등으로 핵심 데이터 개체를 만듭니다. 필요할 때까지로드되지 않습니다.) .

생성/재사용되는 새 셀을 스크롤하기 시작할 때이 메서드를 호출하면 항상 데이터와 함께 200 응답을 얻습니다. 그것은이 "블록"을 일으키는 첫 번째 로딩 일뿐입니다.

+0

볼 수있는 비정상적인 iOS 로그 문이 있습니까? 204 응답은 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html에 따라 responseData에 내용이 없어야합니다. 연결중인 서버를 제어합니까? 차별화 된 로그가 있습니까? –

+0

또한 - sendSynchronousRequest에는 https를 다루는 데 제한이 있으며 일반적으로 비동기 대리자를 사용하면 더 많은 정보를 얻을 수 있습니다 (복잡성으로 인해). 이 http 또는 https입니까? –

+0

안녕하세요 https, 그리고 서버를 제어하지 않습니다 불행히도, 그것은 응용 프로그램 대리인 또는 다른 클래스에서 내 함수를 호출하면 괜찮아요,하지만 탐색 컨트롤러에있는 내 테이블보기에서가 아닌 것 같습니다 이상한 상황을 내가 수행하고있는 컨텍스트와 함께 ... – Daniel

답변

1

비동기 GCD 스레드에서 동기 요청을 수행하고 있으며 시간 제한이 발생했지만 iOS 4의 요청에서만 헤더가 iOS 4와 약간 다르게 전송되었다고 생각합니다. API 응답 시간이 오래 걸릴 수 있습니까? 또는 비동기 스레드에서 서로 다른 스레드에서 동시에 전송 된 여러 개의 요청 (밀리 초 동시)이 전송되기 전에 시스템에서 충돌이 발생 했습니까? 어쨌든

... 이런 경우 google.com 또는 내 자신의 개인 서버 호출 될 것 같지 않았다, 그래서 헤더와 여러 요청을 함께 할 수있는 뭔가해야 ...

내가 github의 asi http를 사용하면 더 효율적으로 작동합니다. 이제는 ASI 큐인 GCD를 사용하지 않습니다.

비동기식 GCD 스레드에서 가능한 타임 아웃이 존속되지 않고 상태 204와 함께 일찍 반환되는 iOS 4 동기 요청에 대한 최종 생각은 무엇입니까?

0

확인 - https 인 경우 sendSynchronousRequest을 사용할 수 없습니다. 문서는 인증 요청을 다운로드하기 위해 필요한 경우 [NSURLConnection connection:didReceiveAuthenticationChallenge:] 같은 일이, 필요한 자격 증명이 URL의 일부로 지정해야합니다 :,

를 즉 몇 가지 주요 사항을 호출하지 않습니다 말한다. 인증이 실패하거나 자격 증명이없는 경우 연결은 자격 증명없이 계속 시도합니다.

솔직히 말해 iOS5에서 계속 작동하고 있다는 것에 놀라지 않을 수 없습니다. 나는 당신이 비동기적인 방법을 사용하여 적어도 어떤 일이 벌어지고 있는지 알아 내기 위해 그것을 디버깅해야한다고 생각한다.

+0

특정 API 끝점에서 기본 인증 만 제공하면되지만 모든 http는 https로 리디렉션됩니다. 문제를 일으키는 원인은 추가 헤더가없는 GET 끝점입니다. – Daniel

+0

iOS4가 iOS5와 같은 방식으로 비동기식 예상치를 처리하지 못하는 원인 인 경우이를 증명하기 위해 비동기식 메소드로 이동해야합니다. –

+0

안녕하십니까, 의견을 보내 주셔서 감사합니다. 문제가 있다고 생각하지 않습니다. 다른 테스트 응용 프로그램에서이 문제를 다시 만들려고했는데 몇 가지 세부 정보로 질문을 업데이트했습니다. 특이한 문제, 어떤 도움이나 아이디어라도 환영합니다 ... – Daniel

관련 문제