0

J'appelle une fonction asynchrone externe qui doit appeler un rappel une fois l'opération terminée.
Cependant, comme la fonction est externe, je ne contrôle pas son implémentation et je veux définir un délai d'attente de 5 secondes comme exemple et considérer l'expiration du délai si le callback passé à cette fonction asynchrone externe n'a pas été invoqué pendant ces 5 secondes.Objective-C Implémenter un délai d'attente de manière non bloquante

Et la seule façon que je trouve actuellement est de faire dormir le thread courant qui bloque réellement le fil.
est un exemple:
+(void)myFuncWithCompletion:(void (^ _Nonnull)(BOOL))completion{ BOOL timedOut = NO; BOOL __block finishedAsyncCall = NO; [someObj someAsyncMethod { // completion callback finishedAsyncCall = YES; if (!timedOut) { completion(YES); } }]; // This is the logic I want to fix. My goal is to make something similar but non-blocking. long timeoutInSeconds = 5; long startTime = [[NSDate date] timeIntervalSince1970]; long currTime = [[NSDate date] timeIntervalSince1970]; while (!finishedAsyncCall && startTime + timeoutInSeconds > currTime) { [NSThread sleepForTimeInterval:0]; currTime = [[NSDate date] timeIntervalSince1970]; } if (!finishedAsyncCall) { timedOut = YES; completion(NO); } }

Répondre

1

Vous pouvez utiliser dispatch_after au lieu de -[NSThread sleepForTimeInterval:]

double delayInSeconds = 5.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); // 1 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // 2 
    if (!finishedAsyncCall) { 
     timedOut = YES; 
     completion(NO); 
    } 
});