2016-12-03 6 views
0

Я пытаюсь получить служебные данные в презентаторе, а затем вызывать метод из ведущего, используя ссылку на представление в ViewController ho можно ли получить обратный вызов из службы. у меня есть служба/Presenter/Просмотр Мой код выглядит следующим образомкак вызвать Swift замыкание callback

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())") 
     } 
    } 

} 

Посмотреть

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:"[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") 
     }) 

} 

Как я должен получить метод обратного вызова при асинхронном выполнении задачи

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

+0

Задержка 5000 означает 5000 секунд – Cruz

ответ

1

Функция обратного вызова должна называться

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

С Заднее закрытие синтаксис имя параметра completion может быть опущено. Ключевое слово in после параметра возврата является обязательным.

+0

Я только получаю Начало загрузки вызывается в журналах ничего после этого? – sector11

+0

Отправляющие пользователи и отправленные журналы пользователей не печатаются? – sector11

+0

Как упоминалось в вопросительном комментарии 5000 секунд. Таким образом, вам нужно подождать почти 2 часа ;-) – vadian

Смежные вопросы