2010-07-31 9 views
11

은 내가 비동기 작업과 같이 있습니다dispatch_async 작업이 완료되면 어떻게 알림을받을 수 있습니까?

dispatch_async(dispatch_get_main_queue(), ^{ 
    myAsyncMethodsHere; 
}); 

배경 작업이 완료 될 때 통지하는 방법이 있나요?

완료되면 메소드를 호출 하시겠습니까?

설명서를 읽었으며 dispatch_after를 살펴 봤지만 특정 시간이 지난 후에 메서드를 디스패치하기 위해 더 많이 설계되었습니다.

도움 주셔서 감사합니다. 워드 프로세서

답변

15

:

COMPLETION 콜백

완료 콜백은 dispatch_async 중첩 호출() 함수를 통해 달성 될 수있다. dispatch_async()에 대한 첫 번째 호출 전에 대상 큐를 유지하고 완료 콜백이 보류 중일 때 대상 큐의 할당이 해제되지 않도록 완료 콜백의 끝에서 해당 큐를 해제해야한다는 점을 기억하는 것이 중요합니다 ( ). 예를 들어

void 
async_read(object_t obj, 
     void *where, size_t bytes, 
     dispatch_queue_t destination_queue, 
     void (^reply_block)(ssize_t r, int err)) 
{ 
     // There are better ways of doing async I/O. 
     // This is just an example of nested blocks. 

     dispatch_retain(destination_queue); 

     dispatch_async(obj->queue, ^{ 
       ssize_t r = read(obj->fd, where, bytes); 
       int err = errno; 

       dispatch_async(destination_queue, ^{ 
         reply_block(r, err); 
       }); 
       dispatch_release(destination_queue); 
     }); 
} 

Source

+0

안녕하세요 .. I이 역시 하나 있습니다 .. 문서화에 따라 즉시 리턴하고, 다음 블럭은 백그라운드에서 비동기 적으로 실행 dispatch_async. 나의 의심은 .. 우리가 내부 dispatch_async 호출 후 dispatch_release를 사용하고 있기 때문에 inner 블록을 실행하기 전에 destination_queue를 해제하지 않을 것인가? – Devarshi

+0

일 수도 있고, 다음과 같이 dispatch_async 콜백 내부에 릴리스를 포함하는 것이 더 나을 수도 있습니다. dispatch_async (destination_queue,^{ reply_block (r, err); dispatch_release (destination_queue);}); – ACBurk

+0

큐가 실행될 때가 아니라 큐 생성시 유지됩니다. –

관련 문제