2014-08-21 1 views
1

:디스패치 비동기 대기열 비우기 -이 코드는 어떻게 작동합니까? 아래 그림과 같이 내가 비동기 요청 전화를 만들고있어

.H 파일 :

하는 .m 파일이
@interface APIManager : NSObject { 
    dispatch_queue_t dataQueue; 
} 

:

:

-(id)init{ 
    dataQueue = dispatch_queue_create("com.test.dataQueue", DISPATCH_QUEUE_SERIAL); 
} 

이 큐에는 다음과 같이 사용된다

dispatch_async(dataQueue, ^(void){ 
    //data retrieval from server + parsing 
}); 

사용자가 로그 아웃하면 다음과 같이 대기열이 비워집니다.

-(void)logout{ 
    dispatch_async(dataQueue, ^{}); 
} 

내가 올바른 방법을 사용하고 있습니까? 큐를 일시 중단 한 다음 다시 시작하고 싶지 않습니다.

답변

2

logout의 코드는 대기열을 비우지 않고 단지 빈 블록을 그 끝에 추가합니다.

그랜드 센트럴 디스패치에는 취소 기능이 없습니다. 마찬가지로 쉽게 사용할 수있는 NSOperationQueue을 사용하고, 에는에 취소 기능이 있습니다.

+0

GCD에는 최신 버전의 취소 기능이 있습니다. 그러나 취소가 여기에서 원하는 것은 분명하지 않다. 어쩌면'dataQueue'의 작업이 실제로 수행 될 필요가있을 것이다. – das

1

dispatch_sync(dataQueue, ^{});-logout으로 호출하면 이전에 대기열에 제출 된 모든 블록이 완료되었음을 알 수 있습니다.

-logout이 호출 된 후 아무도 새로운 블록을 dataQueue에 제출하지 않는 한 대기열이 실제로 비어 있도록 보장하지는 않습니다 (별개의 동기화를 통해).

관련된 모든 작업이 완료되었는지 확인하는 일반적인 기술은 큐에 연결된 디스패치 그룹을 사용하고 dispatch_group_async()을 사용하여 모든 작업을 큐에 전송하는 것입니다. 이렇게하면 그룹의 모든 작업이 dispatch_group_wait()으로 완료되거나 dispatch_group_notify() (예 : "비동기 로그 아웃"의 유형을 트리거하는 경우)을 통해 알림이 수신 될 때까지 기다릴 수 있습니다.