     
     func destroy() {
         PKLog.trace("destory player")
-        self.nonObservablePropertiesUpdateTimer.suspend()
+        self.nonObservablePropertiesUpdateTimer?.invalidate()
         self.removeObservers()
         avPlayerLayer = nil
         _view = nil

        avPlayerLayer = AVPlayerLayer(player: self)
        _view = PlayerView(playerLayer: avPlayerLayer)
        self.onEventBlock = nil
    }
    
    deinit {
        self.destroy()
    }
    
    private func setupNonObservablePropertiesUpdateTimer() {
        PKLog.trace("setupNonObservablePropertiesUpdateTimer")
        
        nonObservablePropertiesUpdateTimer.setEventHandler { [weak self] in
            self?.updateNonObservableProperties()
        }
        nonObservablePropertiesUpdateTimer.scheduleRepeating(deadline: DispatchTime.now(), interval: DispatchTimeInterval.milliseconds(50))
    }
    
    /**

            event = PlayerEvents.durationChange(duration: CMTimeGetSeconds((self.currentItem?.duration)!))
        case #keyPath(rate):
            if rate > 0 {
                self.startOrResumeNonObservablePropertiesUpdateTimer()
            } else {
                self.nonObservablePropertiesUpdateTimer?.invalidate()
                event = PlayerEvents.pause()
            }
        case #keyPath(currentItem.status):
