Reputation: 6963
I am trying to get service data in presenter and then invoking method from presenter using view reference in ViewController ho can i get callback from service. i have Service/Presenter/View My Code is as follows
ViewController
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())")
}
}
}
View
protocol UserView: NSObjectProtocol {
func startLoading()
func stopLoading()
func onUsers(users: [User])
func onEmpty()
}
Service
public class UserService {
func getUsers(delay: Double, completion: @escaping ([User]) -> Void) {
var users = [User]()
users.append(User(name: "User 1", email:"[email protected]", age: 25))
users.append(User(name: "User 2", email: "[email protected]", age: 26))
users.append(User(name: "User 3", email: "[email protected]", age: 27))
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
print("Sending users")
completion(users)
print("Sent user")
}
}
}
Presenter
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")
})
}
How should i get the callback method when async task finishes
func getUsers() {
self.userView?.startLoading()
userService.getUsers(delay: 5000){ users in
print("\(users.count) users added")
// self.userView?.onUsers(users: users)
// self.userView?.stopLoading()
}
}
This is not working as given in answer by @vadian
Upvotes: 0
Views: 3925
Reputation: 285082
The callback function is supposed to be called
func getUsers() {
self.userView?.startLoading()
userService.getUsers(delay: 5000) { users in
print("\(users.count) users added")
}
}
With trailing closure syntax the completion
parameter name can be omitted. The in
keyword after the return parameter is mandatory.
Upvotes: 2