이 항목은 iOS 앱에 있습니다. 나는 GCD를 배우고있다. 그래서, 간단한 것을 시험해보십시오.GCD 비동기 메서드의 동작을 이해할 수 없습니다.
여기의 결과는 나를 혼란스럽게합니다. 왜 항상 2. 진술 문이 먼저오고 그 다음에 1.가 오나요? 두 작업을 GCD로 보내지 만 우선 먼저 설정합니다. 정말 큰 일이 아니기 때문에 set과 2.set은 시간이 겹칠 것입니다. 실행중인 스레드를 인쇄하는 간단한 작업.
나는 스레딩 환경에서 발생하는 것과 다른 결과를 줄 것이라고 예상하면서 여러 번 실행했습니다.
설명해주십시오. 여기
2. Crnt Thread = <NSThread: 0x10920fee0>{name = (null), num = 1}
2. Main thread = <NSThread: 0x10920fee0>{name = (null), num = 1}
1. Crnt Thread = <NSThread: 0x10920fee0>{name = (null), num = 1}
1. Main thread = <NSThread: 0x10920fee0>{name = (null), num = 1}
3. Crnt Thread = <NSThread: 0x10920fee0>{name = (null), num = 1}
3. Main thread = <NSThread: 0x10920fee0>{name = (null), num = 1}
코드 :
void displayAlertView(void *paramContext)
{
NSLog(@"3. Crnt Thread = %@",[NSThread currentThread]);
NSLog(@"3. Main thread = %@", [NSThread mainThread]);
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
dispatch_queue_t myQueue = dispatch_get_main_queue();
AlertViewData *contextData = (AlertViewData *)malloc(sizeof(AlertViewData));
dispatch_async(myQueue,^(void){
NSLog(@"1. Crnt Thread = %@",[NSThread currentThread]);
NSLog(@"1. Main thread = %@", [NSThread mainThread]);
});
if(contextData != NULL)
{
NSLog(@"2. Crnt Thread = %@",[NSThread currentThread]);
NSLog(@"2. Main thread = %@", [NSThread mainThread]);
dispatch_async_f(myQueue, contextData, displayAlertView);
}
return YES;
}
완전히 정확하지 않다고 생각합니다. 블록은 주 스레드에서만 실행되는 * 주 * 큐에 전달됩니다. didFinishLaunchingWithOptions가 직렬 대기열이기 때문에 반환 될 때 실행됩니다. –
@rmaddy : 자세히 설명해 주시겠습니까? GCD 블록은 일반적인 기능을 호출하는 것보다 프로세서 코어에서 더 많은 오버 헤드를 제공합니까? 그런 이유로 2 세트의 계산서가 처음으로 달릴 예정입니까? – Chandu
@MartinR 죄송합니다 - 'myQueue'가 메인 큐입니다. 그에 따라 내 대답을 업데이트 할 것입니다. – rmaddy