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

좋은 웹페이지 즐겨찾기