swift - 多个回调而不是在 swift 中使用委托(delegate)

标签 swift callback delegates closures

我正在开发一个必须向机器发送命令的应用程序。我知道如何使用委托(delegate)来传播我在输入流中收到的命令的响应。但对于某些必须更新 UI 的命令,使用回调可能会更好。

我一直在寻找一个好的解决方案来编写此代码,但我找不到。

在此代码中,例如:

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 - 多个回调而不是在 swift 中使用委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49051680/

相关文章:

iOS Swift : Closures (Callbacks) versus Delegates, 什么时候使用哪个?

ios - 如何在 Xcode + Swift 4 中制作自定义 UIBarButtonItem 类?

swift - 将目录移动到包含空格的目录

java - FocusListener 回调方法不适用于来自同一变量的单独实例化的对象?

c# - 有和没有 "new"的接线事件之间的区别

c# - 如何正确注销事件处理程序

c# - 事件、委托(delegate)与 Action<T>

ios - 如何停止现有的调度队列并开始新的?

ios - XCode 如何设置 UISlider.setMinimumTrackImage 进行裁剪,而不是缩放

javascript - 如何同步 JavaScript 回调?