타사 라이브러리의 알림에 의해 호출되는 대리자 메서드가 2 개 있습니다.변수가 설정되지 않은 경우 변수가 설정 될 때까지 기다립니다.
방법 1 : mediaContentWasUpdated()
방법 2 방법 1에서, 키 변수 (adDuration
)은 통지와 함께 전달 된 파라미터로부터 설정 adMediaDidBeginPlaying()
. 내가 알 수있는 한,이 정보를 얻을 수있는 유일한 곳입니다.
방법 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 두 번째 방법은 알림 위임 메서드이기도합니다. 재생할 광고가있는 경우에만 호출해야합니다. – Conor
첫 번째 메소드에서 'adDuration'이 0보다 큰 경우 광고가 있음을 의미하므로 가짜 알림을 사용하여 두 번째 메소드를 호출 할 수 있습니다. –