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

    private func handleStatusChange() -> PKEvent? {
        var event: PKEvent? = nil
        
        if currentItem?.status == .readyToPlay {
            self.setupNonObservablePropertiesUpdateTimer()
            
            let newState = PlayerState.ready
            self.postEvent(event: PlayerEvents.loadedMetadata())
            

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