2012-02-24 3 views
3

내가 GCD에 대한 매크로를 만들 싶습니다 예를 들어 같은 호출GCD 호출을위한 매크로를 작성 하시겠습니까?

dispatch_async(dispatch_get_main_queue(), ^{ 
    stuff.... 
}); 

매크로는 다음과 같이 볼 수 있습니다 : 주를 (^ {...})?

작성 방법을 잘 모르겠습니다. 어떠한 제안?

감사합니다.

답변

3

당신은 다음과 같은 매크로를 정의 할 수 있습니다

#define ASYNC(...) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ __VA_ARGS__ }) 
#define ASYNC_MAIN(...) dispatch_async(dispatch_get_main_queue(), ^{ __VA_ARGS__ }) 

첫 번째 호출합니다 불특정 스레드 (비동기 적으로 코드를 사용하여 모든 장기 실행 작업 수행) 및 두 번째 스레드는 주 스레드에서 블록을 비동기 적으로 호출합니다 (모든 UI 관련 항목 수행).

둘을 결합 할 수 있습니다. 당신이 쓸 수의 사용자가 네트워크 및 업데이트 UI에서 무언가를 잡아하고 싶은 말은하자

ASYNC({ 
    NSString *result = [[NSString alloc] initWithContentsOfURL: ...]; 
    ASYNC_MAIN({ 
    self.myTextField.string = result; 
    [result release]; 
    }); 
}); 

당신은 코드를 제대로 엑스 코드 들여 쓰기를 만들기 위해 중괄호를 추가합니다.

보관/수신 전화가있는 곳을 유의하십시오. 이것은 코드를 읽을 수있게 해주는 강력한 기술입니다.

9

제안 :하지 마세요. 무엇보다도 디버깅시 줄 번호가 엉망이됩니다.

당신은 실제로 이것은 디버깅시 블록 라인 번호가 손실되지 않는 장점이있다

typedef void(^VoidBlock)(); 
void on_main(VoidBlock block) { 
    dispatch_async(dispatch_get_main_queue(), block); 
} 

처럼 정상적인 당신이 원하는 경우, 같은 일을 할 것입니다 기능, 뭔가를 정의 할 수 있습니다. 나도 같은 일을했습니다

void on_main(VoidBlock block) { 
    if (dispatch_get_current_queue() == dispatch_get_main_queue()) { 
    block(); 
    } else { 
    dispatch_sync(dispatch_get_main_queue(), block); 
    } 
} 

나는 메인 큐에서 호출 할 수 있습니다.

당신 정말 매크로 인수 코드 블록을 넣어 피하려고. 코드를 디버깅해야한다면 스스로 싫어할 것입니다. (A 비트 뺨에 혀,하지만 당신은 여러 줄의 코드로 확장 어떤 매크로를 디버깅해야하는 경우 정말 고통입니다.)

+0

나는 당신의 모든 기능을 명명하는 것은'main'이 좋은 스타일 (C의'main' 기능이) 아니라고 말할 것입니다. –

+0

'main'이라는 이름이 없습니다. '메인'은 메인 어플리케이션 스레드와의 연관성을 나타 내기 위해 이름의 일부로 사용되었지만 단순히 애플 세트 패턴 (예 :'dispatch_get_main_queue ')을 따른 것입니다. – smparkes

+1

코드의 첫 번째 청크에서'void'를 반환하고'VoidBlock'을 인수로 취하는'main' 함수를 정의하고 있습니다. 나는 그것이 하나의 파일에서만 보이기는하지만 함수를 호출하지 않을 것이다. –

관련 문제