Swiftで時限イベントをキャンセルする?
2023-10-03 10:09:42
質問
イベントから10秒後にコードのブロックを実行したいのですが、その10秒前に何かが起こった場合、10秒が過ぎたらコードが実行されないようにキャンセルできるようにしたいのですが、可能ですか?
これを使っているのですが、キャンセルできないんです。
static func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure
)
}
どうすれば実現できますか?
どのように解決するのですか?
これを試してみてください(Swift 2.x、Swift 3については下記のDavidの回答を参照してください)。
typealias dispatch_cancelable_closure = (cancel : Bool) -> ()
func delay(time:NSTimeInterval, closure:()->()) -> dispatch_cancelable_closure? {
func dispatch_later(clsr:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(time * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), clsr)
}
var closure:dispatch_block_t? = closure
var cancelableClosure:dispatch_cancelable_closure?
let delayedClosure:dispatch_cancelable_closure = { cancel in
if let clsr = closure {
if (cancel == false) {
dispatch_async(dispatch_get_main_queue(), clsr);
}
}
closure = nil
cancelableClosure = nil
}
cancelableClosure = delayedClosure
dispatch_later {
if let delayedClosure = cancelableClosure {
delayedClosure(cancel: false)
}
}
return cancelableClosure;
}
func cancel_delay(closure:dispatch_cancelable_closure?) {
if closure != nil {
closure!(cancel: true)
}
}
// usage
let retVal = delay(2.0) {
println("Later")
}
delay(1.0) {
cancel_delay(retVal)
}
こちらのWaamさんのコメントより。 dispatch_after - GCD in swift?
関連
-
[解決済み] 動的に生成された要素にイベントバインディングを行うか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] JavaScriptやデバッグでDOMノード上のイベントリスナーを見つけるには?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] Swiftでindexとelementでループを反復させる方法
-
[解決済み] jQueryイベントKeypress。どのキーが押されたか?
-
[解決済み] Swiftの@selector()?
-
[解決済み] 既存のUIKitアプリケーションにSwiftUIビューを含める
-
[解決済み] Swift で型に表示されるテキスト表現を変更するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] dispatch_after - GCD in Swift?
-
[解決済み] ""内の二重引用符を印刷するには?
-
[解決済み] Swiftの変数に"?"(クエスチョンマーク)と"!"(エクスクラメーションマーク)の装飾を施す。
-
[解決済み] Swiftでenumの関連値を無視して比較する方法は?
-
[解決済み] Optional Boolの値をチェックする
-
[解決済み] Swiftの数学関数
-
[解決済み] XcodeでFirebase Analyticsをオンにする
-
[解決済み] あるプロトコルを特定のクラスにのみ適用することを要求する方法
-
[解決済み] swiftでデータを16進文字列に変換する方法
-
[解決済み] Swiftによる文字列中の部分文字列のインデックス