是否有一种方法可以在延迟后用一个基本参数调用块,就像使用performSelector:withObject:afterDelay:但是使用int/double/float这样的参数?
当前回答
如何使用Xcode内置代码片段库?
Swift更新:
许多向上的投票激励我更新这个答案。
内置的Xcode代码片段库只针对objective-c语言有dispatch_after。人们也可以为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时,请填写完成快捷方式。
有关更多信息,请参阅creatingcustomcodesnippet。
更新Swift 3
拖动此代码并将其放入代码片段库区域。
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(<#delayInSeconds#>)) {
<#code to be executed after a specified delay#>
}
其他回答
这里有一个方便的帮手来防止烦人的GCD调用一遍又一遍:
public func delay(bySeconds seconds: Double, dispatchLevel: DispatchLevel = .main, closure: @escaping () -> Void) {
let dispatchTime = DispatchTime.now() + seconds
dispatchLevel.dispatchQueue.asyncAfter(deadline: dispatchTime, execute: closure)
}
public enum DispatchLevel {
case main, userInteractive, userInitiated, utility, background
var dispatchQueue: DispatchQueue {
switch self {
case .main: return DispatchQueue.main
case .userInteractive: return DispatchQueue.global(qos: .userInteractive)
case .userInitiated: return DispatchQueue.global(qos: .userInitiated)
case .utility: return DispatchQueue.global(qos: .utility)
case .background: return DispatchQueue.global(qos: .background)
}
}
}
现在你只需在主线程上延迟你的代码,就像这样:
delay(bySeconds: 1.5) {
// delayed code
}
如果你想延迟你的代码到不同的线程:
delay(bySeconds: 1.5, dispatchLevel: .background) {
// delayed code that will run on background thread
}
如果你喜欢一个框架,也有一些更方便的功能,然后签出handysswift。你可以通过Carthage将它添加到你的项目中,然后像上面的例子一样使用它:
import HandySwift
delay(bySeconds: 1.5) {
// delayed code
}
我相信作者不是在问如何等待一个分数时间(延迟),而是如何传递一个标量作为参数的选择器(withObject:)和现代objective C中最快的方法是:
[obj performSelector:... withObject:@(0.123123123) afterDelay:10]
你的选择器必须改变它的参数为NSNumber,并使用floatValue或doubleValue这样的选择器检索值
于2021年4月更新,使用Xcode 12.4。这仍然有效,除了现在+按钮显示更多的图标,包括视图库和Modifiers库(见下文),并且视图可能是默认的。 所以一定要选择Snippets库,如下图所示。
(2020年6月在Xcode 11.3.1上验证)
Xcode提供了一个代码片段来做到这一点。您只需输入延迟值和希望在延迟后运行的代码。
点击Xcode右上方的+按钮,当你在编辑一些代码时(而不是在Project Navigator中,在那里会显示其他库,如Capabilities) 确保Snippets库(参见截图,带有{}的图标)被选中,从可用的图标中退出。 搜索之后 它将只返回一个搜索结果,这是所需的片段(见截图)。双击它,你就可以开始了。
如何使用Xcode内置代码片段库?
Swift更新:
许多向上的投票激励我更新这个答案。
内置的Xcode代码片段库只针对objective-c语言有dispatch_after。人们也可以为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时,请填写完成快捷方式。
有关更多信息,请参阅creatingcustomcodesnippet。
更新Swift 3
拖动此代码并将其放入代码片段库区域。
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(<#delayInSeconds#>)) {
<#code to be executed after a specified delay#>
}
下面是Swift 3在延迟后排队工作的方法。
DispatchQueue.main.asyncAfter(
DispatchTime.now() + DispatchTimeInterval.seconds(2)) {
// do work
}
推荐文章
- 如何删除默认的导航栏空间在SwiftUI导航视图
- 如何在iOS中使用Swift编程segue
- Swift -整数转换为小时/分钟/秒
- Swift:声明一个空字典
- 为什么ARC仍然需要@autoreleasepool ?
- 在成功提交我的应用程序后,“太多符号文件”
- 首先添加一个UIView,甚至是导航栏
- 我如何改变UIButton标题颜色?
- 在Swift中如何调用GCD主线程上的参数方法?
- NSLayoutConstraints是可动画的吗?
- iOS -构建失败,CocoaPods无法找到头文件
- Xcode 4挂在“附加到(应用程序名称)”
- CFNetwork SSLHandshake iOS 9失败
- 请求失败:不可接受的内容类型:文本/html使用AFNetworking 2.0
- 缺少推荐的图标文件-该包不包含iPhone / iPod Touch的应用程序图标,像素为“120x120”,png格式