2017-09-06 19 views
0

J'utilise le code ci-dessous dans objective C pour travailler avec sémaphore.dispatch_semaphore_t dans swift 3

-(void)doSome{ 
    semaphore = dispatch_semaphore_create(0); 

    BaseViewController *baseVC = [[BaseViewController alloc]init]; 
    if(baseVC.isUserObjectExist){ 
     [self callLoginWebService:baseVC.userObject.username passwordString:baseVC.userObject.password]; 
    }else{ 
     dispatch_semaphore_signal(semaphore); 
    } 

    while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW)) { //2 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100]]; 
    } 

} 

Mais

'dispatch_semaphore_t' est disponible dans Swift

Comment intégrer sémaphores rapidement 3?

+0

** Ne pas utiliser ** sémaphores pour un tel appel de méthode asynchrone. Utilisez un gestionnaire d'achèvement. – vadian

+0

@vadian, je veux appeler une méthode asynchrone sous l'écran de démarrage. Quoi de mieux. Comment puis-je l'obtenir en utilisant le gestionnaire d'achèvement. S'il vous plaît guider. – pkc456

Répondre

2

vous pouvez créer par

let semaphore = DispatchSemaphore(value: 0) 

Learn official document of Apple

OU d'un autre code

let url = URL(string: "") 
     let semaphore = DispatchSemaphore(value: 0) // 1 
     let _ = DownloadPhoto(url: url!) { 
      _, error in 
      if let error = error { 
      } 
      semaphore.signal() // 2 
     } 
     let timeout = DispatchTime.now() + .seconds(5) 
     if semaphore.wait(timeout: timeout) == .timedOut { // 3 
     } 
+0

Vous avez passé 'valeur' à 0. Quelle est sa signification. – pkc456

+0

2. Dans mon cas, le rappel de 'DownloadPhoto' est dans la file d'attente principale. Donc, le sémaphore n'est jamais signalé. Comment travailler avec des sémaphores en utilisant la file d'attente principale. – pkc456