신호량 해결 블록 비동기화 문제

2446 단어

최근 프로젝트에서 앨범을 가져온 사진을 서버에 업로드할 필요가 있습니다.그러나 PHAsset에서 image로 전환하는 것은 블록이기 때문에 반드시 동기화를 해야 PHAsset이 image로 전환된 후에야 그림을 가져와 업로드할 수 있다.그래서 신호량으로 해결한 문제야.

// asset image
-(UIImage *)getImageWithAsset:(PHAsset *)asset targetSize:(CGSize)targetSize {
    PHImageManager *manager = [PHImageManager defaultManager];
    PHImageRequestOptions *options;

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    __block UIImage * image1;
    [manager requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage *resultImage, NSDictionary *info)
     {
         image1 = resultImage;
         
         dispatch_semaphore_signal(semaphore);
     }];

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    return image1;
    
    
}

신호량에 대한 지식


신호량은 성형값이고 초기 계수값이 있으며 신호 알림과 대기 두 가지 조작을 지원합니다.신호량이 신호에 통지되면 그 계수는 증가한다.하나의 스레드가 하나의 신호량에서 기다릴 때, 스레드는 계수기가 0보다 크면, 스레드가 이 계수를 줄일 때까지 막힌다.
  • GCD에서 세 가지 함수는 semaphore의 조작이다. 각각

  • dispatch_semaphore_create semaphore 만들기
    dispatch_semaphore_신호 보내기
    dispatch_semaphore_대기 신호
  • 세 가지 함수 소개:

  • 첫 번째 함수: 성형 수치의 신호를 만듭니다. 즉, 신호의 총량입니다.
    dispatch_semaphore_create 선언:dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    들어오는 매개 변수는long입니다. 여기 들어오는 매개 변수value는 0보다 크거나 같아야 합니다. 그렇지 않으면dispatch_semaphore_create가 NULL로 돌아갑니다.
    dispatch_ 내보내기semaphore_t 형식이고 값이value인 신호량입니다.
    두 번째 함수: 신호를 보내서 신호 총량을 1 증가시킵니다.dispatch_semaphore_signal(semaphore)
    세 번째 함수: 우선 신호량이 0보다 큰지 판단하고, 0보다 크면 1개의 신호량을 줄이고 아래로 실행하며, 0과 같으면 이 라인을 막는다.
    //    DISPATCH_TIME_NOW( )   DISPATCH_TIME_FOREVER( )
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    

    신호량에 관해서는 일반적으로 주차로 비유할 수 있다.


    주차장에 네 개의 자리가 남으면 네 대의 차가 동시에 와도 멈출 수 있다.만약 이때 다섯 대의 차가 왔다면, 한 대는 기다려야 한다.신호량의 값은 남은 차위의 수에 해당합니다,dispatch_semaphore_wait 함수는 한 대의 차가 온 것과 같다,dispatch_semaphore_시그널은 차를 한 대 탄 셈이다.주차 공간의 남은 수는 초기화할 때 이미 지정되어 있습니다 (dispatch_semaphore_create (long value)).
    디스패치 한 번 호출_semaphore_signal, 나머지 차량 위치 하나 증가;
    디스패치 한 번 호출_semaphore_wait 남은 좌석 하나 줄이기;
    나머지 위치가 0일 때, 다시 차를 타면 (즉 dispatch_semaphore_wait 호출) 기다릴 수밖에 없습니다.동시에 몇 대의 차가 주차장을 기다리고 있을 수도 있다.일부 차주들은 인내심이 없어서 자신에게 대기 시간을 설정했다. 이 시간 동안 주차장을 기다리지 못하고 갔다. 기다리면 차를 몰고 들어가 차를 세웠다.어떤 차주들은 차를 여기에 세우는 것 같아서 계속 기다렸다.

    좋은 웹페이지 즐겨찾기