我有一个仅在当前不执行时才想执行的功能。 我已经使用了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()中调用上述函数
任何帮助将不胜感激,谢谢!!
答案 0 :(得分:4)
我有一个仅在当前不执行时才想执行的功能
您正在寻找锁。但是锁本身是棘手且危险的。获得锁的简单,安全的方法是使用串行队列。正如我们所说,串行队列是一种锁定形式。所以:
如果在主队列上调用了您的函数,则如果当前正在执行,则它无法执行,并且没有任何事情要做。主队列是一个串行队列,只能有一个。
如果在后台队列上调用您的函数,请确保您的队列是串行队列。例如,如果您创建自己的DispatchQueue,则默认情况下它是串行的。
答案 1 :(得分:1)
在这种情况下,我相信您也可以将Operation
与OperationQueue
一起使用。
Operation
支持取消以及检查其是否正在执行。
参考:
OperationQueue:https://developer.apple.com/documentation/foundation/operationqueue
操作:https://developer.apple.com/documentation/foundation/operation