【发布时间】:2017-12-14 19:34:34
【问题描述】:
我有 2 个委托方法,它们被来自 3rd 方库的通知调用。
方法一:
mediaContentWasUpdated()
方法二:
adMediaDidBeginPlaying()
在方法 1 中,一个关键变量 (adDuration) 是从随通知一起传入的参数中设置的。据我所知,这是获取此信息的唯一地方。
在方法 2 中,我们检查 adDuration,如果它大于 0,则更新 UI 以反映我们实际上正在播放广告。
出现了一个错误,有时这两种方法的调用顺序错误。这意味着 adDuration 未设置,方法 2 认为没有要播放的广告媒体,因此不会相应地更新 UI。
我目前的解决方案尝试是将adDuration 设为可选并使用NSCondition 导致方法2 等待方法1 设置adDuration 然后继续。
var adDuration : Double?
let condition = NSCondition()
func mediaContentWasUpdated(notification: NSNotificiation) {
condition.lock()
if(notificationHasAdDurationInfo(notification)) {
self.adDuration = getAdDuration(notification)
condition.signal()
}
condition.unlock()
}
func adMediaDidBeginPlaying(notification: NSNotification) {
condition.lock()
while adDuration == nil {
condition.wait()
}
if adDuration! > Double(0) {
updateUIForAd()
}
condition.unlock()
}
这是我第一次尝试这样的事情,我担心我做错了什么。我还担心不必要地锁定和解锁线程(这会发生在适当的时间运行中,或者如果没有要播放的广告内容)。
外部因素阻碍了我的测试能力,我想在等待这些问题得到解决的同时获得一些意见,看看我是否朝着正确的方向前进。
【问题讨论】:
-
第一种方法中得到
adDuration后为什么不自己调用第二种方法。 -
@SanthoshR 第二种方法也是通知委托方法。只有在有广告即将播放时才应调用它。
-
我知道,但是如果您在第一种方法中得到的
adDuration大于零,则表示存在广告,然后您可以使用虚假通知调用第二种方法。 -
adDuration也可能意味着插播广告可用。代码非常简化,方法 2 使用通过其notification对象发送的信息。 -
为什么在调用
adMediaDidBeginPlaying时没有一个布尔属性设置为true。然后在两个委托中调用你的“updateUI”函数;如果 duration 为 nil 或标志为 false,则让 updateUI 函数立即返回。一旦你有了一个持续时间和一个标志,更新 UI 并清除标志,为下一次做好准备。这样调用委托方法的顺序无关紧要
标签: ios swift multithreading asynchronous delegates