iOS 에서 NSURLConnection 을 사용 하여 HTTP 동기 화 및 비동기 요청 처리
iOS 7 이후 NSURLSession 은 기본적으로 NSURLConnection 을 대체 하여 네트워크 개발 을 진행 하 였 으 며,iOS 9 이후 NSURLConnection 관련 방법 은 완전히 버 려 졌 으 며,iOS 시스템 은 아래로 호 환 되 는 특성 이 있 습 니 다.NSURLConnection 은 이미 버 려 졌 지만 개발 중 에 도 그 방법 은 사용 할 수 있 으 며,낮은 버 전의 iOS 시스템 과 호 환 되 어야 한다 면,NSURLConnection 류 를 사용 해 야 할 때 도 있 습 니 다.
2.NSURLConnection 을 사용 하여 동기 화 요청
네트워크 요청 은 동기 화 와 비동기 두 가지 로 나 뉜 다.동기 화 는 요청 결과 가 돌아 오기 전에 프로그램 코드 가 요청 처 에 걸 리 고 그 후의 코드 가 실행 되 지 않 는 다 는 것 을 말한다.비동기 화 는 요청 을 보 낸 후에 서브 스 레 드 에서 데 이 터 를 받 으 면서 실행 한 후의 코드 를 말한다.데 이 터 를 받 은 후에 메 인 스 레 드 에 알 리 는 방식 으로 처리 하 는 것 을 말한다.
NSURLConnection 동기 화 요청 은 다음 과 같 습 니 다.
4.567914.인쇄 정 보 는 다음 그림 에서 보 듯 이 데이터 가 끝 날 때 뒤의 코드 를 실행 하 는 것 을 알 수 있다.
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
synchronous download on main thread with GCD
메 인 스 레 드 에서 동기 화 다운 로드 를 호출 하면 현재 스 레 드 가 막 히 고 GCD 를 사용 하면 그렇지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.