Наблюдатели за уведомлением не работают в закрытиях в Свифт - PullRequest
1 голос
/ 12 апреля 2019

NotificationCenter.default.post не работает в замыканиях

У меня есть класс с наблюдателями уведомлений

     NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("Start"), object: nil)

     NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("Stop"), object: nil)

     NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("Interrupt"), object: nil)

В том же классе есть метод для обработки уведомления

@objc func methodOfReceivedNotification(notification: Notification) {
    print("Notification Received")
}

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

    NotificationCenter.default.post(name: Notification.Name("Start"), object: nil)

Но при попытке опубликовать то же самое в ответе закрытия сетиметод, который он не вызывает methodOfReceivedNotification

Код закрытия

       executeHttpReq(url: getUIUrl(), getparametersDict: getParameters, onSuccess: { (response, status,isEod) -> (
        Any, String,Bool) in

    NotificationCenter.default.post(name: Notification.Name("Start"), object: nil)
        return (response,status,isEod)
    }, onFailure: { (error) in
        //todo send stop event to the caller

        NotificationCenter.default.post(name: Notification.Name("Stop"), object: nil)

    })

Есть ли какие-либо ошибки в коде, пожалуйста, предложите.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019
  1. Создать расширение
extension Notification.Name {
    static let Start = Notification.Name("Start")
    static let Stop = Notification.Name("Stop")
}

Добавьте следующий код в viewDidLoad
NotificationCenter.default.addObserver(self, selector: #selector(onDidReceiveData(_:)), name: .Start, object: nil)

Добавить функцию в viewController
 @objc func onDidReceiveData(_ notification:Notification) {
        print("image deleted by user")
       // self.isExcluded = true
   }
Уведомление о пожаре в основной очереди
DispatchQueue.main.async {
   NotificationCenter.default.post(name: .Start, object: nil)
}

Пробовал с моим существующим кодом.

RequestManager.shared.doPost(strURL:url, parameter: params) { (response, error) in
            guard error == nil else {
                return
            }
            do {
                if let isSucess = response!["IsSuccessStatusCode"] as? Bool{

                    if isSucess == true{

                                DispatchQueue.main.async {


                                    NotificationCenter.default.post(name: .Start, object: nil)

                                }
                            }
                        }
                    }
                    else{
                        self.showValidationAlert(message: "Try after some time")
                    }
                }
                else{
                    self.showValidationAlert(message: "Try after some time")
                }
            }

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

Попробуйте опубликовать уведомление в главной очереди, когда оно закрыто.

DispatchQueue.main.async {
   NotificationCenter.default.post(name: Notification.Name("Start"), object: nil)
}
...