多个回调而不是在swift中使用Delegates

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个回调而不是在swift中使用Delegates相关的知识,希望对你有一定的参考价值。

我正在开发一个必须将命令发送到机器的应用程序。我知道如何使用委托来传播我在输入流中收到的命令的响应。但对于一些必须更新UI的命令,最好使用Callbacks。

我已经找到了一个很好的解决方案来编码,但我找不到它。

在此代码中,例如:

class NetworkService {

    var onComplete: ((result: String)->())? //an optional function

    func fetchDataFromUrl(url: String) {
        API.request(.GET, url) { result in
            onComplete?(result: result) 
    }
}

class MyViewController: UIViewController {

    let networkService = NetworkService()

    override func viewDidLoad() {
        super.viewDidLoad()
        networkService.onComplete = { result in
            print("I got \(result) from the server!")
        }
    }
}

没关系,我可以使用onComplete作为回调,但是...我需要多个回调来执行多个命令:

  • 我是否要为每个不同的命令创建一个带有回调的“var”?
  • 有没有办法让数组或队列与回调?
  • 会发生什么如果我没有收到命令的响应,我再次发送命令?我想我必须以某种方式处理超时。
  • 什么是解决这个问题的最佳方法?
答案

你试过通知了吗?在您的ViewDidLoad上:

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(dataFetched), name: NSNotification.Name(rawValue: "dataFetched"), object: nil)
    networkService.fetchDataFromUrl(url: url)
}

func dataFetched(_ notification: Notification) {
    // do your stuff with notification.object
}

在您的NetworkService类上

func fetchDataFromUrl(url: String) { 
    API.request(.GET, url)
}

func dataFetched(result: Any) {
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "dataFetched"), object: result)
}

以上是关于多个回调而不是在swift中使用Delegates的主要内容,如果未能解决你的问题,请参考以下文章

在回调块中运行断言而不是在前端显示错误时,GHUnit 崩溃

在 iOS 设备上将多个渲染目标 (MRT) 与多重采样组合失败,而不是在模拟器上

如何在多个视图控制器中使用自定义工具栏而不重复代码和复制元素(swift)?

Mac Catalyst 中的弃用警告,但仅在 Objective-C 中,而不是在 Swift 中

'openURL'在iOS 10.0中已被弃用:请使用openURL:options:completionHandler:而不是在Swift 3中[重复]

设置下一个按钮和完成按钮,而不是在键盘 swift 4 中返回