     }
 
     private var originalContentOffsetY: CGFloat = 0
+
+    private var observingContentOffsetToken: NSKeyValueObservation?
+    private var observingContentSizeToken: NSKeyValueObservation?
 
     open private(set) var state: PullState = .done {
         didSet {

    }

    deinit {
        if containerView != nil {
            containerView.superview?.removeObserver(self, forKeyPath: TorchContentOffsetKey)
            containerView.superview?.removeObserver(self, forKeyPath: TorchContentSizetKey)
        }
    }

    func stopObserving() {
        scrollView.removeObserver(self, forKeyPath: TorchContentOffsetKey)
        if !isPullingDown {
            scrollView.removeObserver(self, forKeyPath: TorchContentSizetKey)
        }
    }

    func startObserving() {

            fatalError("Refreher can only be used in UIScrollView and it's subclasses.")
        }

        observingContentOffsetToken = scrollView.observe(\.contentOffset,
                                                         options: .new) { [weak self] (_, _) in
            guard let strongSelf = self else { return }
            strongSelf.observingContentOffsetChanges()
        }

        originalContentOffsetY = scrollView.contentOffset.y

        if !isPullingDown {
            observingContentSizeToken = scrollView.observe(\.contentSize,
                                                           options: .new) { [weak self] (_, _) in
                guard let strongSelf = self else { return }
                strongSelf.observingContentSizeChanges()
            }
        }
    }

