신호량 해결 블록 비동기화 문제
최근 프로젝트에서 앨범을 가져온 사진을 서버에 업로드할 필요가 있습니다.그러나 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보다 크면, 스레드가 이 계수를 줄일 때까지 막힌다.
// 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보다 크면, 스레드가 이 계수를 줄일 때까지 막힌다.
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 호출) 기다릴 수밖에 없습니다.동시에 몇 대의 차가 주차장을 기다리고 있을 수도 있다.일부 차주들은 인내심이 없어서 자신에게 대기 시간을 설정했다. 이 시간 동안 주차장을 기다리지 못하고 갔다. 기다리면 차를 몰고 들어가 차를 세웠다.어떤 차주들은 차를 여기에 세우는 것 같아서 계속 기다렸다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.