Swift使用GCD实现延迟和取消操作

typealias Task = (_ cancel: Bool) ->()
 class delayGCD {
     func delay(_ time: TimeInterval, task: @escaping ()->()) -> Task? {
         func dispatch_later(block: @escaping ()->()) {
             let t = DispatchTime.now() + time
             DispatchQueue.main.asyncAfter(deadline: t, execute: block)
         }
     var closure: (()->())? = task
     var result: Task?
     let delayedClosure: Task = { cancel in
         if let internalClosure = closure {
             if cancel == false {
                 DispatchQueue.main.async(execute: internalClosure)
             }
         }
         closure = nil
         result = nil
         }
     result = delayedClosure
     dispatch_later {
     if let delayedClosure = result {
             delayedClosure(false)
         }
     }
     return result
     }
     func cancel(_ task: Task?) {
         task?(true)
     }
 }

使⽤就很简单了

delay(3) { print("3 秒后输出") }

取消的话,我们可以先保留⼀个对 Task 的引⽤,然后调⽤ cancel :

let task = delay(5) { print("5秒后打印") }
cancel(task)

下面是完整的使用:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let task = delayGCD().delay(2) {
            print("延迟两秒")
        }
        
        // 取消延迟
        delayGCD().cancel(task)
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现 JSBridge 的关键是在原生的 WKWebView 中添加 JavaScript,使之能够被调用并处理传递的数据。以下是一个简单的 Swift 版本的实现: 1. 在原生代码中添加 JavaScript ```swift // WKWebView 初始化 let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration()) // 注入 JavaScript 脚本 let jsScript = "window.webkit.messageHandlers.jsBridge.postMessage" let userScript = WKUserScript(source: jsScript, injectionTime: .atDocumentEnd, forMainFrameOnly: false) webView.configuration.userContentController.addUserScript(userScript) // 添加消息处理器 webView.configuration.userContentController.add(self, name: "jsBridge") ``` 2. 实现 WKScriptMessageHandler 协议 使用 WKScriptMessageHandler 协议来接收从 JavaScript 中传递的消息。在 Swift 中,需要使用 `@objc` 来声明方法。 ```swift extension ViewController: WKScriptMessageHandler { func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { if message.name == "jsBridge" { // 处理传递的数据 let data = message.body as? [String: Any] // ... } } } ``` 3. 在 JavaScript 中实现调用 在 JavaScript 中使用 `window.webkit.messageHandlers.jsBridge.postMessage(data)` 来将数据传递给原生代码。以下是一个示例: ```javascript // 发送数据给原生代码 window.webkit.messageHandlers.jsBridge.postMessage({ action: "showAlert", data: { message: "Hello from JavaScript!" } }); ``` 通过以上步骤,就可以在 Swift实现一个简单的 JSBridge。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为毛呀

非常感谢你对我的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值