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
播放背景视频,我没有删除UIApplicationDidEnterBackgroundNotification
in 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) 在 viewDidLoad 中设置断点。 B)在您的视图控制器上实现 dealloc 并在其中设置断点。 C) 使dealloc中的定时器失效并作废。 dealloc/deinit 未在 swift 中调用 对不起,我的意思是“deinit”。好的,如果它没有被调用,你的 VC 就没有被释放。 在未使用 deinit 的情况下检查前台代码中的应用程序更新时的无效计时器以上是关于UIApplicationDidEnterBackgroundNotification 多次调用 swift 2.0的主要内容,如果未能解决你的问题,请参考以下文章