gpt4 book ai didi

swift - 如何调用 Swift 闭包回调

转载 作者:行者123 更新时间:2023-11-28 12:35:52 25 4
gpt4 key购买 nike

我正在尝试在 Presenter 中获取服务数据,然后使用 ViewController 中的 View 引用从 Presenter 调用方法我可以从服务中得到回调吗?我有 Service/Presenter/View我的代码如下

View Controller

class ViewController: UIViewController, UserView {

private var userPresenter: UserPresenter?

override func viewDidLoad() {
super.viewDidLoad()
userPresenter = UserPresenter(userView: self)
userPresenter?.getUsers()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func startLoading() {
print("Start loading is called")
}

func stopLoading() {
print("Stop loading is called")
}

func onEmpty() {
print("Empty users returned")
}

func onUsers(users: [User]) {
for userItem in users {
print("User name \(userItem.getName())")
}
}

}

查看

protocol UserView: NSObjectProtocol {
func startLoading()

func stopLoading()

func onUsers(users: [User])

func onEmpty()
}

服务

public class UserService {

func getUsers(delay: Double, completion: @escaping ([User]) -> Void) {
var users = [User]()


users.append(User(name: "User 1", email:"user1@gmail.com", age: 25))
users.append(User(name: "User 2", email: "user2@gmail.com", age: 26))
users.append(User(name: "User 3", email: "user3@gmail.com", age: 27))

DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
print("Sending users")
completion(users)
print("Sent user")
}
}
}

主持人

class UserPresenter {

private var userService: UserService
weak private var userView: UserView?

init(userView: UserView) {
self.userView = userView
userService = UserService()
}

func detachView() {
self.userView = nil
}

func getUsers() {
self.userView?.startLoading()
userService.getUsers(delay: 5000, completion: {
users: [User] -> Void
print("adad")
})

}

异步任务完成时如何获取回调方法

func getUsers() {
self.userView?.startLoading()

userService.getUsers(delay: 5000){ users in

print("\(users.count) users added")

// self.userView?.onUsers(users: users)
// self.userView?.stopLoading()

}
}

这与@vadian 的回答不同

最佳答案

应该调用回调函数

func getUsers() {
self.userView?.startLoading()
userService.getUsers(delay: 5000) { users in
print("\(users.count) users added")
}
}

使用尾随闭包 语法,可以省略completion 参数名称。返回参数后的in关键字是必须的。

关于swift - 如何调用 Swift 闭包回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40948273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com