当前位置: 首页 > 面试题库 >

取消Swift中的定时事件?

太叔飞翰
2023-03-14
问题内容

我想在事件发生后的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
  )
}

我该怎么做?


问题答案:

试试看(Swift 2.x,请参阅下面有关Swift 3的David的回答):

typealias dispatch_cancelable_closure = (cancel : Bool) -> ()

func delay(time:NSTimeInterval, closure:()->()) ->  dispatch_cancelable_closure? {

    func dispatch_later(clsr:()->()) {
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(time * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), clsr)
    }

    var closure:dispatch_block_t? = closure
    var cancelableClosure:dispatch_cancelable_closure?

    let delayedClosure:dispatch_cancelable_closure = { cancel in
        if let clsr = closure {
            if (cancel == false) {
                dispatch_async(dispatch_get_main_queue(), clsr);
            }
        }
        closure = nil
        cancelableClosure = nil
    }

    cancelableClosure = delayedClosure

    dispatch_later {
        if let delayedClosure = cancelableClosure {
            delayedClosure(cancel: false)
        }
    }

    return cancelableClosure;
}

func cancel_delay(closure:dispatch_cancelable_closure?) {
    if closure != nil {
        closure!(cancel: true)
    }
}

// usage
let retVal = delay(2.0) {
    println("Later")
}
delay(1.0) {
    cancel_delay(retVal)
}


 类似资料:
  • 使用on()方法绑定事件后,若希望取消绑定,则可以使用off()方法。off()方法根据传入参数的不同,有不同的实现逻辑。 version added: 2.0.0 .off( event , selector , handler ) event Type: String 需取消绑定的事件名称,例如:'tap' selector Type: String 选择器 handler Type: Fun

  • 本文向大家介绍jquery中取消和绑定hover事件的实现代码,包括了jquery中取消和绑定hover事件的实现代码的使用技巧和注意事项,需要的朋友参考一下 在网页设计中,我们经常使用jquery去响应鼠标的hover事件,和mouseover和mouseout事件有相同的效果,但是这其中其中如何使用bind去绑定hover方法呢?如何用unbind取消绑定的事件呢? 一、如何绑定hover事件

  • 我想取消定义服务的AlarmManager,在此服务中可以启动新的AlarmManager或取消以前定义的报警。我知道alarmManager里的params Pendingtent。取消(挂起内容),必须相同。与filterEquals(Intent other)相比,它仍然不起作用。取消失败。这是我的密码 GetRoundSilence Service和GerRoundNormalServic

  • 我试图在按钮单击事件上清除Popup=>ListView中的选中复选框。 我尝试过循环listview并将property设置为false,但这不起作用。 在此处输入代码x:class=“uc.mainpage”xmlns=“http://schemas.microsoft.com/winfx/2006/xaml/presentation”xmlns:x=“http://schemas.micro

  • 问题内容: 我有使用$ on绑定事件的指令,在销毁作用域时是否需要删除该绑定,或者它是自动完成的?还需要致电$ element.off吗? 问题答案: *由于视图中的端到端绑定,当 *监听器 失去其外观时, 监听器将被自动销毁/清理 。注意,绑定不会发生这种情况。您还可以查看AngularJS的$ scope文档 。 用几句话回答: 将被自动销毁。 您需要手动销毁。 文档说明: 范围销毁-当不再需

  • 如果某个条件为真,是否有方法取消primefaces树中节点的选择事件? 我想显示一个对话框,如果用户选择“取消”选项,则不应更改选择。我曾尝试从p:ajax调用javascript函数,但还是选择了新节点。 我必须重写Primefaces树的默认行为? PF6.2