猿问

在斯威夫特的GCD后派人去吗?

在斯威夫特的GCD后派人去吗?

我经历了iBook来自苹果,却找不到它的任何定义:

有人能解释一下…的结构吗?dispatch_after?

dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)


慕仙森
浏览 503回答 4
4回答

侃侃尔雅

我用dispatch_after通常,我编写了一个顶级实用程序函数来简化语法:func&nbsp;delay(delay:Double,&nbsp;closure:()->())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;dispatch_after( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispatch_time( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DISPATCH_TIME_NOW, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Int64(delay&nbsp;*&nbsp;Double(NSEC_PER_SEC)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispatch_get_main_queue(),&nbsp;closure)}现在你可以这样说话了:delay(0.4)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;do&nbsp;stuff}哇,一种你可以提高语言的语言。还有比这更好的吗?更新SWIFT 3,Xcode 8种子6既然它们已经改进了调用语法,似乎几乎不值得去费心:func&nbsp;delay(_&nbsp;delay:Double,&nbsp;closure:@escaping&nbsp;()->())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;when&nbsp;=&nbsp;DispatchTime.now()&nbsp;+&nbsp;delay&nbsp;&nbsp;&nbsp;&nbsp;DispatchQueue.main.asyncAfter(deadline:&nbsp;when,&nbsp;execute:&nbsp;closure)}

呼唤远方

为了扩展Cezary的答案,它将在1纳秒后执行,我必须在4秒半后执行以下操作。let&nbsp;delay&nbsp;=&nbsp;4.5&nbsp;*&nbsp;Double(NSEC_PER_SEC)let&nbsp;time&nbsp;=&nbsp;dispatch_time(DISPATCH_TIME_NOW,&nbsp;Int64(delay))dispatch_after(time,&nbsp;dispatch_get_main_queue(),&nbsp; block)编辑:我发现我的原始代码稍有错误。如果不将nsec_per_sec强制转换为Double,则隐式类型将导致编译错误。如果有人能提出更好的解决方案,我很想听听。=SWIFT 3的更新=在SWIFT 3中,这是非常简单和优雅的:DispatchQueue.main.asyncAfter(deadline:&nbsp;.now()&nbsp;+&nbsp;4.5)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...}

千巷猫影

如果需要使该块失效,您可能需要使用以下命令:typealias&nbsp;dispatch_cancelable_closure&nbsp;=&nbsp;(cancel&nbsp;:&nbsp;Bool)&nbsp;->&nbsp;Voidfunc&nbsp;delay(time:NSTimeInterval,&nbsp;closure:()->Void)&nbsp;->&nbsp;&nbsp;dispatch_cancelable_closure?&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;dispatch_later(clsr:()->Void)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispatch_after( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispatch_time( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DISPATCH_TIME_NOW, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Int64(time&nbsp;*&nbsp;Double(NSEC_PER_SEC)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispatch_get_main_queue(),&nbsp;clsr) &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;closure:dispatch_block_t?&nbsp;=&nbsp;closure&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;cancelableClosure:dispatch_cancelable_closure? &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;delayedClosure:dispatch_cancelable_closure&nbsp;=&nbsp;{&nbsp;cancel&nbsp;in &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;closure&nbsp;!=&nbsp;nil&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cancel&nbsp;==&nbsp;false)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispatch_async(dispatch_get_main_queue(),&nbsp;closure!); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closure&nbsp;=&nbsp;nil &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cancelableClosure&nbsp;=&nbsp;nil &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;cancelableClosure&nbsp;=&nbsp;delayedClosure &nbsp;&nbsp;&nbsp;&nbsp;dispatch_later&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;delayedClosure&nbsp;=&nbsp;cancelableClosure&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delayedClosure(cancel:&nbsp;false) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cancelableClosure;}func&nbsp;cancel_delay(closure:dispatch_cancelable_closure?)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;closure&nbsp;!=&nbsp;nil&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closure!(cancel:&nbsp;true) &nbsp;&nbsp;&nbsp;&nbsp;}}用途如下let&nbsp;retVal&nbsp;=&nbsp;delay(2.0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;println("Later")}delay(1.0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;cancel_delay(retVal)}学分
随时随地看视频慕课网APP

相关分类

iOS
我要回答