내 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 응답을 얻습니다. 그것은이 "블록"을 일으키는 첫 번째 로딩 일뿐입니다.
볼 수있는 비정상적인 iOS 로그 문이 있습니까? 204 응답은 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html에 따라 responseData에 내용이 없어야합니다. 연결중인 서버를 제어합니까? 차별화 된 로그가 있습니까? –
또한 - sendSynchronousRequest에는 https를 다루는 데 제한이 있으며 일반적으로 비동기 대리자를 사용하면 더 많은 정보를 얻을 수 있습니다 (복잡성으로 인해). 이 http 또는 https입니까? –
안녕하세요 https, 그리고 서버를 제어하지 않습니다 불행히도, 그것은 응용 프로그램 대리인 또는 다른 클래스에서 내 함수를 호출하면 괜찮아요,하지만 탐색 컨트롤러에있는 내 테이블보기에서가 아닌 것 같습니다 이상한 상황을 내가 수행하고있는 컨텍스트와 함께 ... – Daniel