在播放视频时,我看到来自AVPlayer
它的费率更改通知似乎与应用活动无关.
当我的应用程序收到UIApplicationDidEnterBackgroundNotification
通知,我告诉AVPlayer
来pause
.逻辑是它应该返回到用户离开的同一个地方的前台.如果我pause
在去往后台时没有打电话,则不会出现问题.
事件发送到玩家的顺序是pause
,seekToTime:
,play
.通常,这可以正常工作,但是,在将应用程序发送到后台然后返回到前台后,每次play
调用都会导致两次速率更改AVPlayer
.第一个是1,紧接着是第二个是0.每个调用-[AVPlayer play]
只要该播放器实例正在使用,该模式就会继续 .
我能够设置一个断点,-[AVPlayer pause]
当速率变为0时我不会看到它被击中.如果我注释掉这个seekToTime:
电话,问题就会消失.如果我使用seekToTime:completionHandler:
,我也会遇到同样的问题,虽然我的块的finished
参数是YES
.
除了"我如何解决这个问题"之外,我对如何检测AVPlayer
未与play
/ 连接的速率变化原因的任何细节感兴趣pause
.(断点-[AVPlayer setRate:]
似乎永远不会触发.)
(几乎可行的一种解决方法是在进入背景时保存玩家位置,让它播放,并在返回前景时修复位置.这也需要对音频电平进行一些操作,这可能是可行的,但另一个问题是并非所有背景通知都表明视图已被遮挡(例如,双击主页按钮).这会导致我的解决方法在应用程序被中断但仍然可见时显示分散注意力的运动图像的情况.)
建议?
(最后一点额外的信息:在我试过的所有情况下,我最终进入一个状态,即如果我从后台返回并且在调用'play'之后AVPlayer将速率从1改为0.然后进行了一次搜索.我可以做些事情来降低它的频率,但除了摆脱AVPlayer并创建一个新实例之外没有任何消除它.这导致很长的延迟,但比完全故障更好......我猜测.
我有一些证据表明搜索距离会影响结果,这表明错误可能在底层缓冲机制中.在不知道导致费率变化的原因(除了播放/暂停)之外,我没有看到进一步调查的方法.)
我正在尝试将单元测试添加到位于 Objective-C 库之上的 Swift 程序。我目前的主要问题是找到一种方法来注入使用参数化静态工厂方法创建的依赖项。
例如,以下代码可以正常运行,但难以测试:
class Processor {
var service: RegistrationService?
func register(user: String, pass: String) {
let configuration = Configuration(user: user, pass: pass)
service = RegistrationServiceProvider.registrationService(configuration: configuration)
// Do various things with the 'service'
}
}
Run Code Online (Sandbox Code Playgroud)
请注意RegistrationServiceProvider
, 、RegistrationService
、 和Configuration
均来自 Objective-C 库。
我希望能够做的是提供RegistrationService
在此代码中创建的默认值,并在测试时将其替换为我自己的模拟。如果没有该对象,使用http://www.danielhall.io/swift-y-dependency-injection-part-twoConfiguration
之类的东西会相当简单。
(我意识到我可以/应该将Configuration
构造推送给调用者,但这并不能解决如何将其提供给默认服务的问题。)
欢迎提出建议和参考。