2017-07-06 72 views
0

我有一個類,它看起來有點像:如何在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) 
    } 

} 

.......... 

} 

我想執行調用completed(withResult:)只有一次的能力。

有沒有方法將上面的completed(withResult:)方法轉換爲與Swift 3.1兼容的方法?

+1

這個「一次」的範圍是什麼?一次爲應用程序的生命週期安裝?每次執行應用程序一次?類實例的每個生命週期一次?還有別的嗎? – rmaddy

+0

每個場景都可以用一個簡單的布爾測試來解決。 – the4kman

+0

一次用於類實例的生命週期。 –

回答

1

您可以聲明一個布爾變量,該函數被調用一次後變爲false

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

你會想要使用信號量來代替。這很容易在基於回調的代碼可能使用的多線程環境中破解。 – Alexander

0

我不明白的要求不夠好寫恰好滿足您需求的示例代碼,但總體來講,你可能會考慮使用dispatch_once作爲記錄here

+2

dispatch_once在Swift 3中不可用。 –

+2

「dispatch_once」(或其Swift 3等價物)的使用僅對OP的問題中的「once」的某些定義有用。在OP澄清他們的問題之前,我不會推薦它。 – rmaddy

相關問題