         
     }
     
-    // MARK: - Event method
-    
-    private func dispatchHideEvent() {
-        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(options.duration * Double(NSEC_PER_SEC)))
-        dispatch_after(time, dispatch_get_main_queue(), { () -> Void in
-            self.hide()
-        })
-    }
-    
-    // MARK: - Public methods
-    
-    /**
-     Hide action.
-    */
-    public func hide() {
+    // MARK: - Scheduled method
+    
+    /**
+     Starts the timer that hide the BHToast.
+     */
+    private func scheduledHideEvent() {
+        timer = NSTimer.scheduledTimerWithTimeInterval(
+            options.duration,
+            target: self,
+            selector: "hide",
+            userInfo: nil,
+            repeats: false
+        )
+    }
+    
+    // MARK: - Private show method
+    
+    /**
+     Shows the view with animation.
+     */
+    private func showWithAnimation() {
+        view.addSubview(self)
+        
+        setupProperties()
+        
+        UIView.animateWithDuration(
+            options.animationDuration,
+            animations: { () -> Void in
+                self.alpha = 1.0
+            }, completion: { (finish) -> Void in
+                self.scheduledHideEvent()
+            }
+        )
+    }
+    
+    // MARK: - Private hide method
+    
+    /**
+     Hides the view with animation.
+
+     - parameter showAgain: The flag that checks if is necessary to show again the view.
+     */
+    private func hideWithAnimation(completionHandler completionHandler: () -> Void = {}) {
         UIView.animateWithDuration(
             options.animationDuration,
             animations: { () -> Void in
                 self.alpha = 0.0
             }, completion: { (finish) -> Void in
                 self.removeFromSuperview()
+                self.timer.invalidate()
+                completionHandler()
             }
         )
     }
     
-    /**
-     The show method.
-    */
+    // MARK: - Public methods
+    
+    /**
+     Hides the BHToast with fade animation.
+     */
+    public func hide() {
+        hideWithAnimation()
+    }
+    
+    /**
+     Shows the BHToast with animation.
+     
+     * If BHToast has already been added to parent view, dismiss the BHToast to show again.
+     * If some BHToast with BHToastViewTag already exists in parent view, dismiss it to show the new BHToast.
+     * Otherwise, just show the BHToast with fade animation.
+     */
     public func show() {
-        // Remove from screen if the BHToast already exists.
-        if let _view = view.viewWithTag(BHToastViewTag) as? BHToast {
-            _view.hide()
+        if isDescendantOfView(view) {
+            hideWithAnimation(completionHandler: { () -> Void in
+                self.showWithAnimation()
+            })
+        } else if let _view = view.viewWithTag(BHToastViewTag) as? BHToast {
+            _view.hideWithAnimation(completionHandler: { () -> Void in
+                self.showWithAnimation()
+            })
+        } else {
+            showWithAnimation()
         }
-        
-        alpha = 0.0
-        view.addSubview(self)
-        
-        UIView.animateWithDuration(
-            options.animationDuration,
-            animations: { () -> Void in
-                self.alpha = 1.0
-            }, completion: { (finish) -> Void in
-                self.dispatchHideEvent()
-            }
-        )
     }
     
     // MARK: - Constraint methods
     
     /**
-     Generic method to add constraint to item.
-    
+     Generic method to add a constraint.
+
      - parameter: from:             The "from" AnyObject.
      - parameter: fromAttribute:    The "from" NSLayoutAttribute.
      - parameter: relatedBy:        The NSLayoutRelation (default: .Equal)

            toAttribute: .Width,
            multiplier: imageView!.frame.height / imageView!.frame.width
        )
    
    }
    
    /**

    private let view: UIView
    
    /// The display message.
    public var message: String
    
    /// The display imageView (optional)
    public var imageView: UIImageView?
    
    /// The view BHToastOptions
    private let options: BHToastOptions
    
    /// The BHToast width (fixed 300.0).
    private let width: CGFloat = 300.0
    
    /// The message UILabel
    private let messageLabel = UILabel()
    
    /// The timer to hide the BHToast.
    private var timer = NSTimer()
    
    // MARK: - Init methods
    
    /**
     Custom init method.

     Create an instance of BHToast to attach in an UIView.
     You should set a message and can add an image view to display.

     - parameter view:              The UIView that shows the BHToast.
     - parameter message:           The display message.
     - parameter imageView:         The display image view.
     - parameter options:           The BHToastOptions instance.
     */
    public init(
        view: UIView,
        message: String = "",
        imageView: UIImageView? = nil,
        options: BHToastOptions = BHToastOptions())
    {
        self.view = view
        self.message = message
        self.imageView = imageView
        self.options = options
        
        super.init(frame: CGRectZero)
        
        setupViewProperties()
    }
