iOS 에서 NSURLConnection 을 사용 하여 HTTP 동기 화 및 비동기 요청 처리

5049 단어 iOSHTTP
머리말
iOS 7 이후 NSURLSession 은 기본적으로 NSURLConnection 을 대체 하여 네트워크 개발 을 진행 하 였 으 며,iOS 9 이후 NSURLConnection 관련 방법 은 완전히 버 려 졌 으 며,iOS 시스템 은 아래로 호 환 되 는 특성 이 있 습 니 다.NSURLConnection 은 이미 버 려 졌 지만 개발 중 에 도 그 방법 은 사용 할 수 있 으 며,낮은 버 전의 iOS 시스템 과 호 환 되 어야 한다 면,NSURLConnection 류 를 사용 해 야 할 때 도 있 습 니 다.
2.NSURLConnection 을 사용 하여 동기 화 요청
네트워크 요청 은 동기 화 와 비동기 두 가지 로 나 뉜 다.동기 화 는 요청 결과 가 돌아 오기 전에 프로그램 코드 가 요청 처 에 걸 리 고 그 후의 코드 가 실행 되 지 않 는 다 는 것 을 말한다.비동기 화 는 요청 을 보 낸 후에 서브 스 레 드 에서 데 이 터 를 받 으 면서 실행 한 후의 코드 를 말한다.데 이 터 를 받 은 후에 메 인 스 레 드 에 알 리 는 방식 으로 처리 하 는 것 을 말한다.
NSURLConnection 동기 화 요청 은 다음 과 같 습 니 다.
4.567914.인쇄 정 보 는 다음 그림 에서 보 듯 이 데이터 가 끝 날 때 뒤의 코드 를 실행 하 는 것 을 알 수 있다.
20167491116117.png (425×108)
3.NSURLConnection 을 사용 하여 비동기 요청
동기 화 방식 으로 요 구 를 하 는 데 큰 단점 이 있 습 니 다.네트워크 요 구 를 할 때 데이터 의 반환 은 일정한 시간 이 필요 합 니 다.순간 에 완성 할 수 없습니다.동기 화 방식 을 사용 하면 인터페이스 가 끊 기 고 알림 도 없 으 며 어떠한 사용자 와 도 상호작용 을 할 수 없습니다.그러면 사용자 프로그램 이 끊 겨 죽 는 가상 을 줄 수 있 습 니 다.
NSURLConnection 클래스 는 두 가지 방식 으로 비동기 요청 작업 을 제공 합 니 다.
1.block 방식 으로 비동기 요청
다음 코드 를 사용 하여 block 방식 의 비동기 요청 을 합 니 다.block 에 요청 한 반환 데이터 와 데이터 정보 등 매개 변 수 를 입력 합 니 다.    NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSLog(@"%@",data);
    NSLog(@" ");
2.프 록 시 리 셋 의 비동기 요청 방식 사용
우선 프로 토 콜 과 생명 을 지 키 는 가 변 적 인 NSData 는 데 이 터 를 수신 하 는 데 사 용 됩 니 다.    NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    // queue block
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        NSLog(@"%@",data);
    }];
    NSLog(@" ");
다음 코드 를 사용 하여 요청 합 니 다.
4.567914.요청 을 보 낸 후에 다음 과 같은 대리 방법 으로 요청 과정의 감청 과 데 이 터 를 얻 을 수 있 습 니 다.@interface ViewController ()<NSURLConnectionDataDelegate>
{
    NSMutableData * _data;
}
@end
예시
1.NSURLConnection 을 통한 비동기 다운로드:  
NSURLConnection 은 연결 을 실현 하 는 두 가지 방식 을 제공 합 니 다.하 나 는 동기 화 이 고 다른 하 나 는 비동기 입 니 다.비동기 연결 은 새로운 스 레 드 를 만 들 것 입 니 다.이 스 레 드 는 다운로드 동작 을 담당 할 것 입 니 다.동기 화 연결 에 대해 서 는 연결 을 다운로드 하고 처리 할 때 현재 호출 스 레 드 를 막 습 니 다.
많은 개발 자 들 이 동기 화 된 연결 이 메 인 스 레 드 를 막 을 것 이 라 고 생각 하 는데 사실은 이런 관점 은 잘못된 것 이다.동기 화 된 연결 은 호출 스 레 드 를 막 을 수 있 습 니 다.메 인 스 레 드 에 동기 화 연결 을 만 들 면 메 인 스 레 드 가 막 힐 것 입 니 다.그러나 메 인 스 레 드 에서 동기 화 된 연결 이 아니라면 비동기 연결 과 같 을 것 입 니 다.따라서 이런 상황 은 당신 의 메 인 스 레 드 를 막 지 않 을 것 입 니 다.사실 동기 화 와 비동기 의 주요 차이 점 은 runtime 을 실행 하여 비동기 연결 을 위해 스 레 드 를 만 들 고 동기 화 연결 은 하지 않 는 다 는 것 이다.    _data = [[NSMutableData alloc]init];
    NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    [NSURLConnection connectionWithRequest:request delegate:self];
2.NSURLConnection 을 통 해 동시 다운로드:
NSURLConnection 의 sendsynchronousRequest:returning Response:error:클래스 방법 을 사용 하면 동기 화 요청 을 할 수 있 습 니 다.동기 화 된 네트워크 연결 을 만 들 때 우 리 는 우리 의 이 동기 화 연결 이 반드시 우리 의 메 인 스 레 드 를 막 는 것 이 아니 라 는 것 을 알 아야 한다.만약 에 이 동기 화 된 연결 이 메 인 스 레 드 에 만 들 어 졌 다 면 이런 상황 에서 우리 의 메 인 스 레 드 를 막 을 수 있 고 다른 상황 에서 반드시 우리 의 메 인 스 레 드 를 막 을 수 있 는 것 은 아니다.만약 당신 이 GCD 의 전역 병렬 대기 열 에서 동기 화 된 연결 을 초기 화 했다 면,당신 은 사실 우리 의 메 인 스 레 드 를 막 지 않 을 것 입 니 다.
첫 번 째 동기 연결 을 초기 화하 고 무슨 일이 일어 날 지 봅 시다.실례 에서,우 리 는 야 후 를 가 져 오 려 고 시도 할 것 이다.미국 사이트 홈 페이지 내용:-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    //
    [_data setLength:0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    //
    [_data appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    //
    NSLog(@"%@",error);
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    //
    NSLog(@"%@",_data);
}
실행 출력 결 과 를 보 려 면 다음 과 같 습 니 다.
synchronous download on main thread without GCD
20167491155165.jpg (573×58)
synchronous download on main thread with GCD
20167491216196.jpg (571×65)
메 인 스 레 드 에서 동기 화 다운 로드 를 호출 하면 현재 스 레 드 가 막 히 고 GCD 를 사용 하면 그렇지 않 습 니 다.

좋은 웹페이지 즐겨찾기