NSURLSession 시리즈(2) - Session 객체 작성

8665 단어
선언: iOS 개발은 몇 년 동안 잘 정리되지 않았다.이제 지식을 정리하고 남을 돕고 자신을 돕자.
NSURLconfiguration 소절에서 NSURLconfiguration은 NSURLSession을 만드는'설계도'이며 설계도를 어떻게 그리는지 설명했다.이 섹션에서는 설계도를 기반으로 NSURLSession 객체를 작성하고 해당 속성과 메서드를 분석합니다.NSURLSession의 모든 속성과 방법은 기능별로 크게 세 가지 범주로 나눌 수 있습니다.
  • NSURLSession 객체 작성
  • NSURLSession 객체 구성
  • NSURLSession 객체 사용
  • NSURLSession 객체 작성


    NSURSession 을 생성하는 세 가지 방법은 다음과 같습니다.

    기본 세션 객체 만들기

    //  1
    NSURLSession *session = NSURLSession.sharedSession;
    

    클래스 속성 sharedSession 방법을 사용하여 기본 Session 플랜트 메서드를 사용할 수 있습니다.이 대상을 통해 생성된task는 전역적인 NSURLcache, NSHTTPCookieStorage 및 NSURLcredentialStorage를 공유합니다.사용자 정의configuration을 구성하려면 다음 두 가지 방법으로 NSURLSession 객체를 생성해야 합니다.

    맞춤형 세션 객체 만들기


    단독configuration 대상을 사용하면 개성화된session 대상을 만들 수 있습니다.시스템은 다음과 같은 두 가지 방법을 제공합니다.
    //  2
    + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
    //  3
    + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration 
                                      delegate:(id)delegate 
                                 delegateQueue:(NSOperationQueue *)queue;
    

    방법2에서 만든 NSURLSession의 캐치, 쿠키 및https 검사 인증서는 NSURLconfiguration에 의해 결정됩니다.메소드 3-메소드 2의 기능은 생성된 NSURLSession이 지정된 delegate에서 콜백을 받을 수 있는 메소드입니다.리셋 방법에서는 통신 과정 중의 매 단계에 대해 사용자 정의 처리를 할 수 있다.session의 통신 과정은 모두 하위 라인에서 진행된다.그래서 Block 방법과delegate 방법은 모두 하위 라인에서 호출됩니다.delegateQueue 전송 시스템이 기본적으로 NSOperationQueue를 만들면 모든 delegate 방법의 호출은 기본 NSOperationQueue에서 처리됩니다.그렇지 않으면 지정된 NSOperationQueue에서 데이터를 처리합니다.물론 NSOperationQueue를 설정할 때 그 병발수를 지정할 수 있습니다. 만약 병발수가 1로 지정된다면 AF네트워크와 마찬가지로 NSURLSessionTask 대상 하나만 데이터를 수신하거나 발송할 수 있습니다.이것에 관해서는 AFNetwork 편에서 상세하게 설명할 것이다.사용 중의 차이는 방법 1과 방법 2는 Block을 통해서만 데이터의 수신을 완성할 수 있고 데이터의 수신 결과만 얻을 수 있다.방법3은 전체 데이터 교환 과정을 감시하고 수정할 수 있다.이렇게 이해할 수 있습니다. 하나는 내부에서 호출하는 방법입니다. 다만 Configuration을 기본값으로 전달합니다.방법은 두 번째는 호출하는 방법입니다. 세 번째는delegate와delegateQueue를nil로 설정하는 것입니다.위조 코드는 다음과 같습니다.
    //  1 
    + (instancetype)sharedSession {
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
        return [self sessionWithConfiguration:configuration];
    }
    //  2 
    + (instancetype)sessionWithConfiguration:(NSURLSessionConfiguration*)configuration {
        return [self sessionWithConfiguration:configuration delegate:nil delegateQueue:nil];
    }
    

    Session 객체 구성


    세션 대상을 설정한다고 하는데 사실 정확하지 않습니다.세션 대상을 설정하고 조작해야 한다. 만약에 지난 절의 비유를 사용하면session 대상은 데이터Task 대상을 생산하고 운송하는 공장이다. 그러면 아래의 방법은 공장에 기계, 스위치 등을 추가하는 것이다.이런 방법은 크게 두 가지로 나뉘는데 그것이 바로session 대상을 설정하고session 대상을 조작하는 것이다.

    세션 객체 구성


    세션 객체를 구성하는 네 가지 속성은 다음과 같습니다.
  • delegate
  • delegatequeue
  • configuration
  • sessionDescription

  • sessionDescription을 제외한 세 개는session 대상을 생성한 후에 변경할 수 없고 접근할 수 있습니다.그 중에서configuration은 이전 절에서 이미 그 작용을 말한 적이 있다.delegate를 설정하고 delegate 방법을 실현하면 클라이언트와 서버가 통신하는 과정이delegate에 접근합니다.주의해야 할 것은 Block으로 데이터를 받아들여도delegate는 여전히 호출될 수 있다는 것이다.다만 NSURLSessionTaskDelegate 방법은 호출되지 않습니다.구체적인 과정은 다음 절에서 이야기할 것이다.delegatequeue는delegate가 어느 라인에서 호출되는지 확인하는 것입니다.전역 라인에서 기본적으로 호출되지 않으면

    세션 객체 작업


    세션 객체를 조작하는 6가지 방법은 다음과 같습니다.
    - (void)finishTasksAndInvalidate;
    - (void)invalidateAndCancel;
    - (void)resetWithCompletionHandler:(void (^)(void))completionHandler; 
    - (void)flushWithCompletionHandler:(void (^)(void))completionHandler; 
    - (void)getTasksWithCompletionHandler: (^)(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks))completionHandler
    - (void)getAllTasksWithCompletionHandler:(void (^)(NSArray<__kindof nsurlsessiontask=""> *tasks))completionHandler
    

    finishTaskAndInvalidate는 응답이 되돌아오거나 시간이 초과될 때까지 기다려서session이 효력을 상실합니다.invalidateAndCancel은session을 즉시 무효화시키고 실패한delegate를 호출합니다.나머지 네 가지 방법은 모두 완성할 때의completionHandler와 관련이 있어 자주 사용되지 않기 때문에 여기서 잠시 토론하지 않겠습니다.

    세션에 작업 추가


    세션 대상을 만들고 설정을 완성하면 드디어 일을 할 수 있는 지경입니다. 즉, 데이터Task 대상을 생성하여 보내는 것입니다.session은 두 가지 방법으로 데이터Task의 데이터 교환을 완성합니다.
  • Block을 통해 데이터를 수신하기;
  • delegate를 통해 데이터를 수신한다.

  • NSURLSession 파일을 볼 때 나머지 메서드가 이 기능으로 사용되고 있음을 알 수 있습니다.다음은 이 방법들의 작용을 설명할 것이다.

    block 수신 데이터


    애플은 Block을 통해 데이터를 수신할 수 있는 7가지 방법을 제공했다.공식적으로는 이 방법들이 편리한 방식으로 Datatask를 세션에 추가한다고 말한다.여기서 주의해야 할 사항은 다음과 같습니다.
  • 모든 편리한 방법은 실례적인 방법이기 때문에 반드시 우리 선생이session의 대상이 되어야 한다.애플은 데이터task를 기본session 대상에 추가하는 방법을 제공하지 않았습니다.
  • 이 편리한 방법은 요청을 보내는 것이 아니라 데이터task를session에 추가할 뿐입니다.HIA 요청을 보내려면 반환된 DataTask 객체에서 수동으로 resume를 호출해야 합니다.

  • 이 방법은 크게 세 가지로 나눌 수 있는데 그것이 바로 데이터 요청, 데이터 업로드, 데이터 다운로드이다.
    /*
     *  
     */ 
    - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
    - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
    
    /*
     *  
     */
    - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
    - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(nullable NSData *)bodyData completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
    
    /*
     *    
     * When a download successfully completes,
     * the NSURL will point to a file that must be read or
     * copied during the invocation of the completion routine.  
     * The file will be removed automatically.
     */
    - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
    - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
    - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
    

    위에서delegate를 소개할 때 Block으로 데이터를 수신할 때session이 만들 때delegate를 설정하면delegate를 호출하는 방법을 사용합니다.

    delegate 데이터 수용


    애플은 delegate에서 데이터를 수신하는 데 사용되는 10가지 방법을 제공했다. 데이터 요청 2개, 데이터 업로드 3개, 데이터 다운로드 3개, 데이터 흐름 2개 방법이다.이곳의 방법은 Block과 유일하게 다른 것은 요청한 데이터가delegate에서 수신되는 것이다.

    데이터 요청 방법


    데이터 요청의 두 가지 방법도 우리가 자주 사용하는 두 가지 방법이다.
    - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;
    - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;
    

    애플 주석을 보면 POST 요청은 반드시 첫 번째 방법을 사용해야 한다는 것을 알 수 있다.GET 요청은 두 번째 방법을 사용할 수 있습니다.다운로드한 업로드, 다운로드, 데이터 흐름이 자주 사용되지 않아 잠시 소개하지 않겠습니다.

    나머지 방법


    데이터 업로드, 다운로드, 데이터 흐름 방법은 잠시 연구하지 않았으나, 나중에 시간이 있으면 다시 상세하게 연구하자.
    //  
    - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL;
    - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData;
    - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request;
    
    //  
    - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request;
    - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url;
    - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData;
    
    //  
    - (NSURLSessionStreamTask *)streamTaskWithHostName:(NSString *)hostname port:(NSInteger)port NS_AVAILABLE(10_11, 9_0) __WATCHOS_PROHIBITED;
    - (NSURLSessionStreamTask *)streamTaskWithNetService:(NSNetService *)service NS_AVAILABLE(10_11, 9_0) __WATCHOS_PROHIBITED;
    

    필수 Request


    DataTask를 생성하려면 URL과 Request가 필요합니다.NSURLSessionDataTask는 클라이언트와 서버의 데이터 요청 작업을 한 번만 나타냅니다.모든 작업의 상세한 정보는 NSURLRequest 대상에 의해 결정됩니다. 예를 들어 요청 방법인 POST/GET, 요청 헤더, 요청체 등입니다.NSURL Session DownloadTask와 NSURL Session UploadTask가 NSURL Request 대상에 대한 요구, 예를 들어 요청 헤더를 무시했는지 여부, 요청체 등은 나중에 자세히 살펴보자.

    좋은 웹페이지 즐겨찾기