UIApplicationDidEnterBackgroundNotification 多次调用 swift 2.0

Posted

技术标签:

【中文标题】UIApplicationDidEnterBackgroundNotification 多次调用 swift 2.0【英文标题】:UIApplicationDidEnterBackgroundNotification called multiple time swift 2.0 【发布时间】:2015-11-24 07:44:38 【问题描述】:

我正在创建播放 youtube 视频的应用程序。

在这个应用中,

用户可以播放 youtube 视频,当用户进入后台或锁定手机时会播放视频声音

我使用UIApplicationDidEnterBackgroundNotification 播放背景视频,我没有删除UIApplicationDidEnterBackgroundNotificationin viewDidDisappear,因为我想在整个应用程序中播放视频声音

这里是代码

 override func viewDidLoad() 
    super.viewDidLoad()
      NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationDidEnterBackgroundNotification, object: nil)

      NSNotificationCenter.defaultCenter().addObserver(self, selector: "playBgVideo", name: UIApplicationDidEnterBackgroundNotification, object: nil)
  

 func playBgVideo()
 
   bgTimer =  NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "hello", userInfo: nil, repeats: true)
   NSNotificationCenter.defaultCenter().addObserver(self, selector: "playFgVideo", name: UIApplicationWillEnterForegroundNotification, object: nil)
 

 func hello()
 
  player?.play()
 

 func playFgVideo()

 bgTimer?.invalidate()
 NSNotificationCenter.defaultCenter().removeObserver(self, name:UIApplicationWillEnterForegroundNotification, object: nil)



当我第一次播放视频时,后台播放工作完美,因为UIApplicationDidEnterBackgroundNotification 调用了一次,但我播放第二个视频然后后台播放不起作用,因为UIApplicationDidEnterBackgroundNotification 调用了两次

给我建议我该如何解决这个问题?

谢谢

【问题讨论】:

定时器是干什么用的?你添加了多少次观察者? 可能是您在 viewDidLoad 中添加和删除通知。如果您的视图没有解除分配,则 viewDidLoad 永远不会再次触发。尝试在 viewWillAppear 中添加通知并删除 viewWillDisappear。 我无法删除 viewWillDisappear 中的通知,因为它是整个应用程序所必需的 @Wain 我只在 viewDidLoad 中添加了一次观察者 @John 如果您解决了问题,您介意分享您的解决方案吗? 【参考方案1】:

我的建议是在NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationDidEnterBackgroundNotification, object: nil) 处设置一个断点,并确保self 具有相同的内存地址(我认为它会有所不同)。一般来说,这意味着:

    当您输入viewDidLoad() 时,您取消注册一个不存在的 观察者(但你应该有一个例外)。 您注册self,然后由计时器保留。一切都在重复。

附:通常,您似乎希望调用 dealloc 以便您可以执行清理或根本不处理 dealloc。

【讨论】:

好的。 A) 在 vi​​ewDidLoad 中设置断点。 B)在您的视图控制器上实现 dealloc 并在其中设置断点。 C) 使dealloc中的定时器失效并作废。 dealloc/deinit 未在 swift 中调用 对不起,我的意思是“deinit”。好的,如果它没有被调用,你的 VC 就没有被释放。 在未使用 deinit 的情况下检查前台代码中的应用程序更新时的无效计时器

以上是关于UIApplicationDidEnterBackgroundNotification 多次调用 swift 2.0的主要内容,如果未能解决你的问题,请参考以下文章