2017-07-06 69 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

相关问题