有没有一种方法可以在延迟后使用原始参数来调用块,例如使用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
以自动完成以下操作:
这是一个带有两个浮点数作为 “参数” 的示例。您不必依赖任何类型的宏,并且代码的意图非常明确:
let time1 = 8.23
let time2 = 3.42
// Delay 2 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
print("Sum of times: \(time1 + time2)")
}
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)")
}
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 。
将此代码拖放到代码段库区域中。
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(<#delayInSeconds#>)) {
<#code to be executed after a specified delay#>
}