2017-07-06 4 views
0

J'ai une classe qui ressemble un peu:Comment faire un appel de fonction qu'une seule fois dans Swift 3.1?

final class Token { 

.......... 

public enum Result { 

    case Success() 
    case Failure(Error) 

} 

private var successClosure : (() -> Void)? 
private var failureClosure : ((Error) -> Void)? 

public func completed(withResult result: Token.Result) { 

    switch result { 
     case .Success: successClosure?() 
     case .Failure(let error): failureClosure?(error) 
    } 

} 

.......... 

} 

Je voudrais faire respecter la possibilité d'appeler completed(withResult:) une seule fois.

Existe-t-il une méthode de conversion de la méthode completed(withResult:) en une méthode compatible avec Swift 3.1?

+1

Quelle est la portée de ce "une fois"? Une fois pour la durée de vie de l'application en cours d'installation? Une fois par exécution de l'application? Une fois par vie de l'instance de classe? Autre chose? – rmaddy

+0

Chaque scénario peut être résolu avec un simple test booléen. – the4kman

+0

Une fois pour la durée de vie de l'instance de classe. –

Répondre

1

Vous pouvez déclarer une variable booléenne qui passe à false lorsque la fonction a été appelée une seule fois.

fileprivate var firstCompletionTime = true 

public func completed(withResult result: Token.Result) { 
    guard firstCompletionTime else { 
     return 
    } 

    switch result { 
     case .Success: successClosure?() 
     case .Failure(let error): failureClosure?(error) 
    } 

    firstCompletionTime = false 
} 
+0

Vous devrez utiliser un sémaphore à la place. Cela se casse facilement dans un contexte multithread, que ce code basé sur les rappels utilise probablement. – Alexander

0

Je ne comprends pas assez bien besoin d'écrire un exemple de code qui répond exactement à vos besoins, mais d'une manière générale, vous pouvez envisager d'utiliser dispatch_once comme here documenté.

+2

dispatch_once n'est pas disponible dans Swift 3. –

+2

L'utilisation de 'dispatch_once' (ou son équivalent Swift 3) n'est utile que pour certaines définitions de" once "dans la question OP. Je ne le recommanderais pas avant que le PO clarifie sa question. – rmaddy