Как получить один и тот же обратный вызов в двух ViewController, когда один открыт? - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу получить тот же обратный вызов в ViewController, который открывается во время ответа сервера в моем приложении Swift.

У меня есть два ViewController.Первый ViewController регистрирует callBack из класса «NetworkService».

Второй ViewController открывается из первого ViewController, а второй получает «NetworkService» из первого ViewController, инициализированного в переменной, а затем регистрирует тот же callBack,

Когда я пытаюсь получить обратный вызов с сервера, если открывается первый ViewController, я получаю ответ.Если я открываю второй ViewController и пересылаю ответ, я получаю это правильно во втором ViewController.

НО, если я вернусь к первому ViewController и получу ответ, он все время будет получен только на Second ViewController.

class NetworkService {

    var onFunction: ((_ result: String)->())?

    func doCall() {
        self.onFunction?("result")
    }

}


class MyViewController: UIViewController {

    let networkService = NetworkService()

    override func viewDidLoad() {
        super.viewDidLoad()

        networkService.onFunction = { result in
            print("I got \(result) from the server!")
        }

    }
}

Я открываю secondViewController следующим образом:

let vc = self.storyboard!.instantiateViewController(withIdentifier: "second") as! SecondViewController
vc. networkService = networkService
        self.navigationController?.pushViewController(vc, animated: true)

И Второй ViewController:

class SecondViewController: UIViewController {

    var networkService: NetworkService?

    override func viewDidLoad() {
        super.viewDidLoad()

        networkService!.onFunction = { result in
            print("I got \(result) from the server!")
        }

    }
}

Как можно было бы снова получить ответ в первом ViewController, а затем вернуться к первому ViewController от второго, вызывающего popViewController?

self.navigationController?.popViewController(animated: false)  

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Вы можете использовать уведомление, но вам придется регистрировать и отменять регистрацию VC при переключении между представлениями.Другой вариант - использовать делегат, вам нужно будет поделиться экземпляром NetworkService.Быстрый пример того, как это может работать с протоколом.

protocol NetworkServiceProtocol {
    var service: NetworkService? { get }
    func onFunction(_ result: String)
}

class NetworkService {

    var delegate: NetworkServiceProtocol?

    func doCall() {
        self.delegate?.onFunction("results")
    }

    func update(delegate: NetworkServiceProtocol) {
        self.delegate = delegate
    }
}

class VC1: UIViewController, NetworkServiceProtocol {
    var service: NetworkService?

    init(service: NetworkService? = nil) {
        self.service = service
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.service?.update(delegate: self)
    }

    func onFunction(_ result: String) {
        print("On Function")
    }
}
0 голосов
/ 24 апреля 2019

Как насчет вызова функции внутри viewDidAppear на обоих ViewControllers, чтобы вы получали ответ при каждом переключении между двумя представлениями?Вам не нужно передавать networkService между контроллерами ViewControllers.

override func viewDidAppear(_ animated: Bool) {

  networkService!.onFunction = { result in
            print("I got \(result) from the server!")
        }

}
...