我想在一个事件的10秒内运行一段代码,但是我希望能够取消它,这样如果在那10秒之前发生了某些事情,代码将在10秒后不再运行.
我一直在使用它,但它不可取消:
static func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure
)
}
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
这个问题早已被问到了。但是我找不到适合当前Swift版本的不错的解决方案。
Swift 4-如何取消对的特定通话DispatchQueue.main.asyncAfter
?
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
// my code
}
Run Code Online (Sandbox Code Playgroud)
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
// just cancel this event!
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码,我一直试图从swift 2转换为swift 3.这是我到目前为止所拥有的.
DispatchQueue.async(group: DispatchQueue.global(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),execute: {
self.controllerDelegate?.codeToRun(progressWindowViewController: self)
})
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,指出无法使用类型(int,int)的参数列表调用'global'.我知道全局队列需要这个,除非他们在swift 3中改变它吗?在Swift 3中执行全局队列的正确方法是什么?
以前的Swift 2 Equivlent
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),{
self.controllerDelegate?.codeToRun(self)
})
Run Code Online (Sandbox Code Playgroud) 我有一个用于introViewController的DispatchQueue,它显示一个11秒的gif然后显示我的登录页面......但是还有一个跳过介绍并显示登录的按钮.当我点击它时,仍在运行的时间和当我在应用程序中导航时,在时间结束时返回登录.
这是我的班级
class GifClass: UIViewController {
@IBOutlet weak var gifImage: UIImageView!
@IBOutlet weak var skipButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
gifImage.loadGif(name: "promed")
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(11)) {
self.performSegue(withIdentifier: "introLogin", sender: self)
}
}
@IBAction func skip(_ sender: Any) {
performSegue(withIdentifier: "introLogin", sender: self)
}
}
Run Code Online (Sandbox Code Playgroud)
如何点击按钮停止时间?