У меня это ниже в приложении iOS. Я учу GCD. поэтому, пробуя простые вещи.Поведение метода async GCD непонятно
Здесь вывод этого меня сбивает с толку. Почему всегда начинается 2. набор утверждений, а затем 1.? Несмотря на то, что я отправляю две задачи в GCD, сначала отправлю 1. сначала поставлю. Это не очень большая задача, так что 1. 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;
}
Не совсем правильно, я думаю. Блок отправляется в очередь * main *, которая выполняется только в основном потоке. Он выполняется, когда didFinishLaunchingWithOptions возвращается, потому что это очередная очередь. –
@rmaddy: Не могли бы вы объяснить подробно? Блоки GCD дают больше накладных расходов на ядро процессора, чем вызов нормальной функции? Вот почему сначала запускается 2 набора инструкций? – Chandu
@MartinR К сожалению, я забыл, что 'myQueue' - главная очередь. Я соответствующим образом обновлю ответ. – rmaddy