iOS 개발 웹편 일일 NSURLconnection 및 Runloop(면접문제)
NSURLconnection은 네트워크 요청을 전송하기 위해 에이전트를 설정합니다.
1. NSURLconnection 설정 에이전트로 네트워크 요청을 보내고 에이전트 방법은 기본적으로 메인 라인에서 실행됩니다.
setDelegateQueue: 프록시 방법이 하위 라인에서 실행되도록 설정할 수 있습니다.
[connect setDelegateQueue:[[NSOperationQueue alloc] init]];
주의: 안 됩니다
[connect setDelegateQueue: [NSOperationQueue mainQueue]] 이렇게 설정하면 프록시 방법이 실행되지 않습니다.
2. 프록시를 설정하는 방식 자체가 비동기적으로 실행된다.
3. NSURLconnection에 에이전트를 설치한 후이론적으로connect 변수가 큰 괄호를 내면 방출된다.왜 프록시 메서드를 사용합니까\
the calling thread's run loop must be operating in the default run loop mode 때문에.이 방법은 내부적으로 사실\
연결 대상을source로runloop에 추가하고 실행 모드를 기본 모드로 설정합니다.모든 프록시 메서드가 서버에서 반환된 데이터를 실행/수신한 후\
석방될 거야.(기본 모드여야 함)
4. initWithRequest: delegate: startImmediately를 사용하여 요청을 보낼 때:
// startImmediately: YES NO . [connect start]
[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
5. 네트워크 요청을 보내는 절차도 하위 라인에 넣고 실행한다.이 경우 프록시 방법이 호출되지 않습니다(startImmediately = YES).
원인:connect 대상은sourse로runloop에 추가되었습니다.이때connect 재자선정에서서브라인의runloop이 자동으로 열리지 않았습니다. 서브라인의runloop을 우리가 열어야 합니다.
6. 전제: 네트워크 요청이 하위 라인에서 실행됨: startImmediately가 NO일 때 [connect start] 방법을 호출하면 프록시 방법을 호출할 수 있습니다.왜 그런 걸까요?
제5조, startImmediately=YES, 서브스레드runloop을 수동으로 열어야 한다.
주의: 이것은 [connect start]의 start 방법 때문입니다. start 방법은 기본적인connect 대상을runloop에 추가하고 실행 모드를 기본으로 설정합니다. 만약 현재의runloop이 있다면
오픈하지 않으면 start 방법 내부에서 현재 라인의runloop 대상을 자동으로 가져와 오픈합니다.
코드는 다음과 같습니다.
// Created by on 2017/12/12.
// Copyright © 2017 sunny. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self delegate2];
}
//
- (void)delegate1
{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8080/MJServer/login?username=123&pwd=123&method=get&type=JSON"]];
//
// :
// NSURLConnection . connect . \
the calling thread’s run loop must be operating in the default run loop mode. \
connect source runloop , . / ,\
NSURLConnection *connect = [NSURLConnection connectionWithRequest:request delegate:self];
//
// [NSOperationQueue alloc] init] ,
// [NSOperationQueue mainQueue] .
// [connect setDelegateQueue:[NSOperationQueue mainQueue]];
[connect setDelegateQueue:[[NSOperationQueue alloc] init]];
// zy----
NSLog(@"zy-----");
}
- (void)delegate2
{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8080/MJServer/login?username=123&pwd=123&method=get&type=JSON"]];
//
// :
// startImmediately: YES NO . [connect start]
NSURLConnection *connect = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
//
[connect setDelegateQueue:[[NSOperationQueue alloc] init]];
//
[connect start];
// zy----
NSLog(@"zy-----");
}
- (void)newThreadDelegate1
{
//
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8080/MJServer/login?username=123&pwd=123&method=get&type=JSON"]];
//
// :
NSURLConnection *connect = [NSURLConnection connectionWithRequest:request delegate:self];
//
[connect setDelegateQueue:[[NSOperationQueue alloc] init]];
NSLog(@"---%@---",[NSThread currentThread]);
// runloop( runloop )
[[NSRunLoop currentRunLoop] run];
//
// [[NSRunLoop currentRunLoop] runMode:UITrackingRunLoopMode beforeDate:[NSDate date]];
});
}
- (void)newThreadDelegate2
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8080/MJServer/login?username=123&pwd=123&method=get&type=JSON"]];
//
// :
// startImmediately: YES NO . [connect start]
NSURLConnection *connect = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
//
[connect setDelegateQueue:[[NSOperationQueue alloc] init]];
//
// If you don’t schedule the connection in a run loop or an operation queue before calling this method, the connection is scheduled in the current run loop in the default mode.\
start connect runloop .
// : runloop , runloop
[connect start];
NSLog(@"---%@---",[NSThread currentThread]);
});
}
#pragma -mark NSURLConnectionDataDelegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"didReceiveResponse---%@",[NSThread currentThread]);
}
@end
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
NSURLConnection, NSURLRequest, NSURL 을 간단하게 사용 합 니 다.다음은 코드 이 고 주석 도 비교적 명확 하 게 썼 다. 헤더 파일 은 프로 토 콜 을 실현 해 야 합 니 다. NSURLConnectionDelegate 와 NSURLConnectionDataDelegate 원본 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.