2017-03-01 3 views
-1

comme nous le savons main_queue est une série queue.There est pas async réel.il n'y a pas async dans la file d'attente principale?

- (void)someMethod{ 
    dispatch_async(dispatch_get_main_queue(),^{ 
    NSLog(@"main_async invoke"); 
    }); 
    NSLog(@"method invoke"); 
} 

le code ci-dessus « méthode Invoke » sera écrire avant « main_async invoquer » .car dans main_queue il n'y a pas async réel. mais le code ci-dessous peut sai NO:

- (void)someMethod{ 
    __block BOOL flag=YES; 
     NSBlockOperation *blockOperation = [NSBlockOperation  blockOperationWithBlock:^{ 
       NSLog(@"blockOperation invoke"); 
       [NSThread sleepForTimeInterval:4]; 
       dispatch_async(dispatch_get_main_queue(), ^{ 
          NSLog(@"main_async invoke"); 
          flag=NO; 
       }); 
     }]; 
     [blockOperation start]; 
     while (flag) { 
       [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; 
     } 
     NSLog(@"method invoke"); 
    } 

le code ci-dessus « méthode Invoke » sera écrit après « main_async invoquer » Je pense qu'il est à cause des « il RunLoop'.Is quelqu'un peut expliquer c'est pourquoi?

+0

Que voulez-vous dire "réel async"? Dans votre premier exemple, le bloc est exécuté de manière asynchrone. Comme vous le signalez, la file d'attente principale est une file d'attente série et, comme les tâches ne sont pas préemptées, le bloc ne s'exécutera pas avant le retour de la méthode en cours, mais il est toujours asynchrone. Peut-être que vous voulez dire l'exécution parallèle, et non cela ne peut pas arriver sur n'importe quelle file d'attente en série. – Paulw11

+0

Je peux comprendre le premier exemple. Ma question est pourquoi dans le second exemple, 'NSLog (@ "main_async invoke")' s'exécute avant 'NSLog (@ "méthode invoke")' Dans ma compréhension le bloc n'exécutera pas jusqu'à un certain temps après le retour de la méthode actuelle. Dans le deuxième exemple, le bloc s'exécute avant le retour de la méthode en cours. – DoradoIs90

+0

Parce que dans le deuxième bloc vous démarrez directement l'opération. Vous ne le soumettez pas à une file d'attente d'opérations pour une exécution ultérieure. – Paulw11

Répondre

0

Il existe une différence entre exécuter async sur le thread principal et sync sur le thread principal. sync signifie essentiellement, faites-le maintenant, async signifie, faites-le sur le fil principal, mais il ne doit pas être à ce moment précis.

0

Y a-t-il quelqu'un qui peut expliquer pourquoi?

Parce qu'il s'agit de async - asynchrone. C'est ce que asynchrone signifie. Cela signifie "plus tard".

Votre code se poursuit après le [blockOperation start]; jusqu'à la fin de la méthode. Alors seulement, le fil principal sera libéré. Ce n'est qu'alors que le bloc asynchrone sur le thread principal a une chance d'entrer et d'être exécuté.

+0

Il pourrait être utile d'expliquer que 'async' ou' sync' dans 'dispatch_async' s'applique à l'appel' dispatch_async' La différence est que 'dispatch_sync' attend que le bloc soit exécuté, ce qui n'est pas le cas de 'dispatch_async'. –