尽管观察者被移除,通知观察者多次呼叫

问题描述:

当应用处于后台模式或手机处于睡眠状态并且收到VoIp推送时,AppDelagte中的以下功能会指示用户(至应用中的UserTableViewController)以及发布通知。尽管观察者被移除,通知观察者多次呼叫

UserTableViewController的viewDidLoad中的通知观察者观察通知并调用func simulateMyIncomingCallFromNotification

我注意到,当我第二次拨打VoIP推送号码func simulateMyIncomingCallFromNotification两次,第三次,三次等。我怎样才能避免多个电话?

其他的答案,建议删除通知观察者,我甚至在设置之前,我正在做的,你可以在下面的扩展中看到,但这似乎并没有解决我的问题。

我该如何解决这个问题?

在AppDelegate中:

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) { 

let storyboard = UIStoryboard(name: "User", bundle: nil) 

VC = storyboard.instantiateViewController(withIdentifier: "UserTableViewController") as! UserTableViewController 

self.window = UIWindow(frame: UIScreen.main.bounds) 
     self.window?.rootViewController = VC 
     self.window?.makeKeyAndVisible() 


NotificationCenter.default.post(name: Notification.Name("didReceiveIncomingVoipPush"), object: nil, userInfo: payloadDict) 
} 

在UserTableViewController

extension NotificationCenter { 
    func setObserver(_ observer: AnyObject, selector: Selector, name: NSNotification.Name, object: AnyObject?) { 
     print("NotificationCenter.default before: \(NotificationCenter.default)") 
     NotificationCenter.default.removeObserver(observer, name: name, object: object) 
     NotificationCenter.default.addObserver(observer, selector: selector, name: name, object: object) 
     print("NotificationCenter.default after: \(NotificationCenter.default)") 
    } 
} 

fun viewDidLoad(){ 

NotificationCenter.default.setObserver(self, selector: #selector(self.simulateMyIncomingCallFromNotification(notification:)), name: Notification.Name("didReceiveIncomingVoipPush"), object: nil) 

} 

Apple建议观察员应在viewWillAppear注册和未注册viewWillDissapear

你可以这样试试。

在通知中获取多个呼叫可能是您的控制器未被取消初始化以及您每次向该控制器的新实例添加新观察者时的情况。 你可以做什么:

在该方法上添加断点并尝试print(self)并查看倍数调用的地址。

或只加

deinit() { 
    print(self) 
} 

,并检查类是否被deinitilized与否。

如果不是这种情况,您可以尝试@Himanth解决方案。

+0

'在该方法上添加断点或deinit()方法? – user44776

+0

多次调用的方法simulateMyIncomingCallFromNotification – ankit