Swift处理这种情况的方法,而不是使用布尔值

时间:2019-10-09 12:33:16

标签: ios swift cocoa-touch boolean

我有一个仅在当前不执行时才想执行的功能。 我已经使用了bool变量来检查当前执行情况。

Swift是否提供了其他解决方案来代替Bool来处理此问题?

 guard
        !isExecuting,
        let currentNavVC = tabBarController.selectedViewController as? UINavigationController
        else { return }

    isExecuting = true

    let first = currentNavVC.viewControllers.first,
    let last = currentNavVC.viewControllers.last
    var controllers = [first]
    if first != last {
        controllers = [first, last]
    }

    DispatchQueue.main.async {
        currentNavVC.viewControllers = controllers
        isExecuting = false
    }

布尔变量:正在执行

注意:

使用信号量( DispatchSemaphore )进行了尝试,但它们没有帮助。
我也在didReceiveMemoryWarning()中调用上述函数

任何帮助将不胜感激,谢谢!!

2 个答案:

答案 0 :(得分:4)

  

我有一个仅在当前不执行时才想执行的功能

您正在寻找。但是锁本身是棘手且危险的。获得锁的简单,安全的方法是使用串行队列。正如我们所说,串行队列是一种锁定形式。所以:

  • 如果在主队列上调用了您的函数,则如果当前正在执行,则它无法执行,并且没有任何事情要做。主队列是一个串行队列,只能有一个。

  • 如果在后台队列上调用您的函数,请确保您的队列是串行队列。例如,如果您创建自己的DispatchQueue,则默认情况下它是串行的。

答案 1 :(得分:1)

在这种情况下,我相信您也可以将OperationOperationQueue一起使用。

Operation支持取消以及检查其是否正在执行。

参考:

OperationQueue:https://developer.apple.com/documentation/foundation/operationqueue

操作:https://developer.apple.com/documentation/foundation/operation