Как получить один и тот же обратный вызов в двух ViewController при открытии одного?

Я хочу получить тот же обратный вызов в 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)  

Почему бы вам не попробовать NSNotification вместо обратного звонка. Таким образом, вы получите обратный вызов всем наблюдателям этого уведомления, независимо от того, где вы находитесь.

Ayan Sengupta 23.04.2019 23:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
297
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как насчет вызова функции из 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")
    }
}

Другие вопросы по теме