是否有一种方法可以在延迟后用一个基本参数调用块,就像使用performSelector:withObject:afterDelay:但是使用int/double/float这样的参数?


当前回答

于2021年4月更新,使用Xcode 12.4。这仍然有效,除了现在+按钮显示更多的图标,包括视图库和Modifiers库(见下文),并且视图可能是默认的。 所以一定要选择Snippets库,如下图所示。


(2020年6月在Xcode 11.3.1上验证)

Xcode提供了一个代码片段来做到这一点。您只需输入延迟值和希望在延迟后运行的代码。

点击Xcode右上方的+按钮,当你在编辑一些代码时(而不是在Project Navigator中,在那里会显示其他库,如Capabilities) 确保Snippets库(参见截图,带有{}的图标)被选中,从可用的图标中退出。 搜索之后 它将只返回一个搜索结果,这是所需的片段(见截图)。双击它,你就可以开始了。

其他回答

dispatch_after函数在给定时间后将块对象分派到分派队列。使用下面的代码在2.0秒后执行一些UI相关的任务。

            let delay = 2.0
            let delayInNanoSeconds = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
            let mainQueue = dispatch_get_main_queue()

            dispatch_after(delayInNanoSeconds, mainQueue, {

                print("Some UI related task after delay")
            })

在swift 3.0中:

            let dispatchTime: DispatchTime = DispatchTime.now() + Double(Int64(2.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
            DispatchQueue.main.asyncAfter(deadline: dispatchTime, execute: {

          })

在swift 3中,我们可以简单地使用DispatchQueue.main.asyncAfter函数在延迟'n'秒后触发任何函数或动作。在代码中,我们将延迟设置为1秒后。在此函数体中调用将在延迟1秒后触发的任何函数。

let when = DispatchTime.now() + 1
DispatchQueue.main.asyncAfter(deadline: when) {

    // Trigger the function/action after the delay of 1Sec

}

您可以将参数包装在自己的类中,也可以将方法调用包装在不需要在基本类型中传递的方法中。然后在延迟之后调用该方法,并在该方法中执行您希望执行的选择器。

您可以使用dispatch_after稍后调用一个块。在Xcode中,开始输入dispatch_after并按Enter键自动完成如下内容:

下面是一个使用两个浮点数作为“参数”的示例。你不需要依赖任何类型的宏,代码的意图是非常清楚的:

斯威夫特3,斯威夫特4

let time1 = 8.23
let time2 = 3.42

// Delay 2 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    print("Sum of times: \(time1 + time2)")
}

斯威夫特2

let time1 = 8.23
let time2 = 3.42

// Delay 2 seconds
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
        println("Sum of times: \(time1 + time2)")
}

Objective - C

CGFloat time1 = 3.49;
CGFloat time2 = 8.13;

// Delay 2 seconds
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    CGFloat newTime = time1 + time2;
    NSLog(@"New time: %f", newTime);
});

按Cmd + Shift + L显示Xcode内置代码片段库:

寻找分派之后,然后,只需拖放到您的代码。