9 multithreading(다중 스레드)/NSURLSession(세션) - 스탠퍼드 iOS

3898 단어
다중 루틴은 프로그램의 실행 경로를 다른 경로로 나누어 가능한 한 같은 시간에 실행하도록 하는 것이다.
1. 지정된 대기열에서 Block 실행
dispatch_queue_t queue = ....;
dispatch_async(queue,^{});

2. 홈팀을 얻는 2가지 방법
dispatch_queue_t mainQ = dispatch_get_main_queue();     //     

NSOperationQueue *mainQ = [NSOperationQueue mainQueue];     //      oc API

3. 큐 만들기
dispatch_queue_t otherQ = dispatch_queue_create("name",NULL);   //    const char *    ,                   , NULL     
  • 홈팀 열에서 Block
  • 실행
    - (void)performSelectorOnMainThread:(SEL)aMethod withObject:(id)obj waitUntilDone:(BOOL)waitUntilDone;
    
       
    
    dispatch_async(dispatch_get_main_queue(),^{ /* call aMethod */ });
    

    NSURLSession을 만드는 방법은 코드가 실행될 스레드 큐를 결정합니다.
    4. URL을 통한 데이터 다운로드, NSURLSession 사용 지침 및 워크플로우
    NSURLSession에서 제공하는 기능: 1.URL을 통해 데이터를 메모리로 다운로드합니다. 2.URL을 통해 파일 시스템에 데이터를 다운로드합니다. 3.지정된 URL에 데이터 업로드 4.백그라운드에서 상술한 기능을 완성하다
    NSURLSession으로 데이터를 전송하는 4단계:
    1. NSURLSessionConfiguration(세션 구성기)을 생성하여 NSSession(세션)에 대한 작업 모드를 설정합니다.
       NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    

    작업 모드는 다음과 같습니다.
  • 일반 모드(default): 작업 모드는 원래의 NSURLconnection과 유사하며 캐시의Cache,Cookie,감권을 사용할 수 있습니다.
  • 임시 모드(ephemeral): 캐시를 사용하지 않는Cache,Cookie,감권.
  • 백그라운드 모드(background): 백그라운드에서 업로드와 다운로드를 완성하고Configuration 대상을 만들 때 NSString의 ID를 주어 작업을 완성하는 세션이 누구인지 추적해야 한다(뒤에 설명할 것이다).

  • 2. 지정된 세션 구성기로 세션을 생성하고 실행 중인 네트워크 스레드를 선택하면 두 가지 생성 방법이 있습니다.
        //1.sessionWithConfiguration:
        //2.sessionWithConfiguration:delegate:delegateQueue:
        NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration ];
    

    첫 번째는 방금 만든 Configuration에 따라 세션을 만드는 것입니다. 시스템은 기본적으로 새로운 OperationQueue (대기열) 를 만들어서 세션 메시지를 처리합니다.
    두 번째는 리셋을 설정할 수 있는 delegate (이 리셋 delegate가 강제로 인용될 수 있음을 주의하십시오), 그리고 리셋을 어느 OperationQueue (대기열) 에서 설정할 수 있습니다. 만약 우리가 그것을 [NSOperationQueue mainQueue] 로 설정하면 메인 라인에서 리셋을 매우 편리하게 할 수 있습니다.
    3. 세션 (세션) 의 세션 방법을 호출하여 Request 요청을 실행하고, Request가 필요하면task로 돌아갑니다.
    기능에 따라task에는 세 가지 피드류가 있는데 그것이 바로 NSURLSessionUploadTask: 업로드용Task입니다. 업로드가 끝난 후에 다시 결과를 다운로드하지 않습니다.NSURLSessionDownloadTask: 다운로드용Task;NSURLSessionDataTask: 컨텐트를 업로드하고 업로드가 완료되면 다운로드할 수 있습니다.
    4. 받은 Task 에서 resume를 호출하여 작업을 시작합니다.

  • 5. 코드 인스턴스
        /*
                : 
         1.     NSURLRequest    (       NSURLReauest  )
         2.     NSURLSession   (     )
         3.   session         request   
         */
        
        //1.    URL  
        NSURLRequest *request = [NSURLRequest requestWithURL:self.imageURL];
        
        //2.    NSURLSessionConfiguration(     ),     "    "
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
        
        //3.     "    "       ,            ,   sessionWithConfiguration        
        NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration ];
        
        //4.   session         request   (         )
        NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request
                                                        completionHandler:^(NSURL *localfile, NSURLResponse *response, NSError *error) {
                                                            
                  if (!error) {
                      if ([request.URL isEqual:self.imageURL]) {
                                                                    
                              UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:localfile]];
    
                              dispatch_async(dispatch_get_main_queue(), ^{ self.image = image; });
                              }
                         }
                                                        }];
        [task resume];    //        task

    좋은 웹페이지 즐겨찾기