 
 public extension UITableView {
 
-    public func animateRows(animation: TableViewAnimation) {
+    public func animateRows(animation: TableViewAnimation, completion: (() -> Void)? = nil) {
         switch animation {
 
         case .left(let duration, let staggered):
-            self.animateTableViewWithDirection(duration: duration, direction: .left, staggered: staggered, strongDamping: false)
+            self.animateTableViewWithDirection(duration: duration, direction: .left, staggered: staggered, strongDamping: false, completion: completion)
 
         case .right(let duration, let staggered):
-            self.animateTableViewWithDirection(duration: duration, direction: .right, staggered: staggered, strongDamping: false)
+            self.animateTableViewWithDirection(duration: duration, direction: .right, staggered: staggered, strongDamping: false, completion: completion)
 
         case .top(let duration):
-            self.animateTableViewWithDirection(duration: duration, direction: .top, staggered: false, strongDamping: true)
+            self.animateTableViewWithDirection(duration: duration, direction: .top, staggered: false, strongDamping: true, completion: completion)
 
         case .bottom(let duration):
-            self.animateTableViewWithDirection(duration: duration, direction: .bottom, staggered: false, strongDamping: false)
+            self.animateTableViewWithDirection(duration: duration, direction: .bottom, staggered: false, strongDamping: false, completion: completion)
 
         case .fade(let duration, let consecutively):
-            self.animateTableViewWithFade(duration: duration, consecutively: consecutively)
+            self.animateTableViewWithFade(duration: duration, consecutively: consecutively, completion: completion)
 
         case .custom(let duration, let startingTransform, let staggered):
-            self.animateTableViewWithTransform(duration: duration, transform: startingTransform, staggered: staggered)
+            self.animateTableViewWithTransform(duration: duration, transform: startingTransform, staggered: staggered, completion: completion)
 
         }
     }
 
-    public func reloadTableViewWithFadeAnimation(duration: TimeInterval = 0.3) {
+    public func reloadTableViewWithFadeAnimation(duration: TimeInterval = 0.3, completion: (() -> Void)? = nil) {
         self.reloadData()
 
-        self.animateTableViewWithFade(duration: duration, consecutively: false)
+        self.animateTableViewWithFade(duration: duration, consecutively: false, completion: completion)
     }
 
     public func reloadTableViewSmoothly() {

                cell.alpha = 0.0
                UIView.animate(withDuration: duration, delay: animationDelay, options: .curveEaseInOut, animations: {
                    cell.alpha = 1.0
                }, completion: nil)
            }
        } else {
            let animation = UITableView.fadeAnimationTransition
            animation.duration = duration

            self.layer.add(animation, forKey: "UITableViewReloadDataAnimationKey")
        }
    }


            }
        }

        func yPosition(tableView: UITableView) -> CGFloat {
            if case .top = self {
                return -tableView.frame.height
            } else if case .bottom = self {
                return tableView.frame.height
            } else {
                return 0
            }
