我正在开发一个必须向机器发送命令的应用程序。我知道如何使用委托(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/