silentsudo
silentsudo

Reputation: 6963

how to call Swift closure callback

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

Answers (1)

vadian
vadian

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

Related Questions