내가 GCD에 대한 매크로를 만들 싶습니다 예를 들어 같은 호출GCD 호출을위한 매크로를 작성 하시겠습니까?
dispatch_async(dispatch_get_main_queue(), ^{
stuff....
});
매크로는 다음과 같이 볼 수 있습니다 : 주를 (^ {...})?
작성 방법을 잘 모르겠습니다. 어떠한 제안?
감사합니다.
내가 GCD에 대한 매크로를 만들 싶습니다 예를 들어 같은 호출GCD 호출을위한 매크로를 작성 하시겠습니까?
dispatch_async(dispatch_get_main_queue(), ^{
stuff....
});
매크로는 다음과 같이 볼 수 있습니다 : 주를 (^ {...})?
작성 방법을 잘 모르겠습니다. 어떠한 제안?
감사합니다.
당신은 다음과 같은 매크로를 정의 할 수 있습니다
는#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];
});
});
당신은 코드를 제대로 엑스 코드 들여 쓰기를 만들기 위해 중괄호를 추가합니다.
보관/수신 전화가있는 곳을 유의하십시오. 이것은 코드를 읽을 수있게 해주는 강력한 기술입니다.
제안 :하지 마세요. 무엇보다도 디버깅시 줄 번호가 엉망이됩니다.
당신은 실제로 이것은 디버깅시 블록 라인 번호가 손실되지 않는 장점이있다
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 비트 뺨에 혀,하지만 당신은 여러 줄의 코드로 확장 어떤 매크로를 디버깅해야하는 경우 정말 고통입니다.)
나는 당신의 모든 기능을 명명하는 것은'main'이 좋은 스타일 (C의'main' 기능이) 아니라고 말할 것입니다. –
'main'이라는 이름이 없습니다. '메인'은 메인 어플리케이션 스레드와의 연관성을 나타 내기 위해 이름의 일부로 사용되었지만 단순히 애플 세트 패턴 (예 :'dispatch_get_main_queue ')을 따른 것입니다. – smparkes
코드의 첫 번째 청크에서'void'를 반환하고'VoidBlock'을 인수로 취하는'main' 함수를 정의하고 있습니다. 나는 그것이 하나의 파일에서만 보이기는하지만 함수를 호출하지 않을 것이다. –