协慌网

登录 贡献 社区

延迟后如何触发一个块,例如 - performSelector:withObject:afterDelay :?

有没有一种方法可以在延迟后使用原始参数来调用块,例如使用performSelector:withObject:afterDelay:但是使用诸如int / double / float这样的参数?

答案

我认为您正在寻找dispatch_after() 。它要求您的块不接受任何参数,但是您可以让该块从本地范围捕获那些变量。

int parameter1 = 12;
float parameter2 = 144.1;

// Delay execution of my block for 10 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    NSLog(@"parameter1: %d parameter2: %f", parameter1, parameter2);
});

更多: https//developer.apple.com/documentation/dispatch/1452876-dispatch_after

您可以使用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)")
}

目标 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);
});

如何使用 Xcode 内置代码段库?

在此处输入图片说明

Swift 更新:

许多赞成票启发了我更新这个答案。

内置的 Xcode 代码段库具有dispatch_after ,仅适用于objective-c语言。人们还可以为Swift创建自己的自定义代码段

用 Xcode 编写。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(<#delayInSeconds#> * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {
        <#code to be executed after a specified delay#>
    })

将此代码拖放到代码段库区域中。 在此处输入图片说明

在代码段列表的底部,将有一个名为My Code Snippet的新实体。编辑此标题。在输入 Xcode 时提供建议,请填写 “ Completion Shortcut

有关更多信息,请参见CreationaCustomCodeSnippet

更新 Swift 3

将此代码拖放到代码段库区域中。

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(<#delayInSeconds#>)) {
    <#code to be executed after a specified delay#>
}