             keyWindow.addConstraints([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint])
             }())
 
-        hideTimer = scheduledTimer(activityData.minimumDisplayTime, selector: #selector(hideTimerFired(_:)), data: nil)
-    }
-
+        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(activityData.minimumDisplayTime)) {
+            self._hide()
+        }
+    }
+
+    private func _hide() {
+        if state == .waitingToHide {
+            hide()
+        } else {
+            state = .waitingToHide
+        }
+    }
+    
     private func hide() {
         guard let keyWindow = UIApplication.shared.keyWindow else { return }
-
+        
         for item in keyWindow.subviews
             where item.restorationIdentifier == restorationIdentifier {
                 item.removeFromSuperview()
         }
-        showTimer?.invalidate()
-        showTimer = nil
-    }
-
-    private func scheduledTimer(_ timeInterval: Int, selector: Selector, data: ActivityData?) -> Timer {
-        return Timer.scheduledTimer(timeInterval: Double(timeInterval) / 1000,
-                                    target: self,
-                                    selector: selector,
-                                    userInfo: data,
-                                    repeats: false)
+        state = .hidden
     }
 }


/// Presenter that displays NVActivityIndicatorView as UI blocker.
public final class NVActivityIndicatorPresenter {
    private var showTimer: Timer?
    private var hideTimer: Timer?
    private var isStopAnimatingCalled = false
    private let restorationIdentifier = "NVActivityIndicatorViewContainer"
    private let messageLabel: UILabel = {
        let label = UILabel()

        guard let keyWindow = UIApplication.shared.keyWindow else { return }

        keyWindow.addSubview(containerView)
        state = .showed

        // Add constraints for `containerView`.
        ({
