Dans la documentation d'Apple pour NSRunLoop il existe un exemple de code démontrant la suspension de l'exécution en attendant qu'un drapeau soit activé par quelque chose d'autre.
BOOL shouldKeepRunning = YES; // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
J'ai utilisé cette méthode et elle fonctionne, mais en examinant un problème de performance, j'ai trouvé la cause de ce morceau de code. J'utilise presque exactement le même morceau de code (seul le nom du drapeau est différent :) et si je mets un fichier NSLog
sur la ligne qui suit la mise en place de l'indicateur (dans une autre méthode) et ensuite une ligne après l'indicateur while()
il y a une attente apparemment aléatoire de plusieurs secondes entre les deux relevés de journal.
Le délai ne semble pas être différent sur les machines plus lentes ou plus rapides, mais il varie d'une exécution à l'autre, d'au moins quelques secondes à 10 secondes.
J'ai contourné ce problème avec le code suivant mais il ne semble pas normal que le code original ne fonctionne pas.
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (webViewIsLoading && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
En utilisant ce code, les déclarations de journal lors de l'activation du drapeau et après la boucle while sont maintenant systématiquement espacées de moins de 0,1 seconde.
Quelqu'un a-t-il une idée de la raison pour laquelle le code original présente ce comportement ?