【问题标题】:UIApplicationDidEnterBackgroundNotification called multiple time swift 2.0UIApplicationDidEnterBackgroundNotification 多次调用 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 如果您解决了问题,您介意分享您的解决方案吗?

标签: ios swift swift2 ios9


【解决方案1】:

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

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

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

【讨论】:

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