Я хочу получить тот же обратный вызов в ViewController, который открывается во время ответа сервера в моем приложении Swift.
У меня есть два ViewController'а. Первый ViewController регистрирует callBack из класса NetworkService.
Второй ViewController открывается из первого ViewController, а второй получает «NetworkService» от первого ViewController, инициализированного в переменной, а затем регистрирует тот же callBack.
Когда я пытаюсь получить обратный вызов от сервера, если открывается первый ViewController, я получаю ответ. Если я открою второй ViewController и повторно отправлю ответ, я правильно получу это во втором ViewController.
НО, если я вернусь к первому ViewController и получу ответ, он все время будет получен только на втором 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)





Как насчет вызова функции из viewDidAppear на обоих ViewController, чтобы вы получали ответ каждый раз, когда переключаетесь между двумя представлениями? Вам не нужно будет передавать networkService между ViewControllers.
override func viewDidAppear(_ animated: Bool) {
networkService!.onFunction = { result in
print("I got \(result) from the server!")
}
}
Вы можете использовать уведомление, но вам придется регистрироваться и отменять регистрацию 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")
}
}
Почему бы вам не попробовать
NSNotificationвместо обратного звонка. Таким образом, вы получите обратный вызов всем наблюдателям этого уведомления, независимо от того, где вы находитесь.