             loadingView.alpha = 0
             UIView.animate(withDuration: 0.3, animations: {
                 loadingView.alpha = 1.0
-            }, completion: completion)
+            }, completion: { finished in
+                loadingView.alpha = 1.0
+                completion?(finished)
+            })
         } else if let completion = completion {
             completion(true)
         }
     }
     
-    public class func removeLoadingViews(inView view: UIView, animated: Bool) {
+    public class func removeLoadingViews(inView view: UIView, animated: Bool, completion: ((Void) -> Void)? = nil) {
+        var loadingViews = [LoadingView]()
         view.subviews.forEach { view in
             if let loadingView = view as? LoadingView {
-                loadingView.removeFromSuperview(animated: animated)
+                loadingViews.append(loadingView)
+            }
+        }
+        var numberOfViews = loadingViews.count
+        for view in loadingViews {
+            view.removeFromSuperview(animated: animated) { _ in
+                numberOfViews -= 1
+                if numberOfViews == 0,
+                    let completion = completion {
+                    completion()
+                }
             }
         }
     }


// MARK: UIView extensions
public extension UIView {
    public func removeLoadingViews(animated: Bool) {
        LoadingView.removeLoadingViews(inView: self, animated: animated)
    }
}

    }
    
    public func removeFromSuperview(animated: Bool, completion: ((Bool) -> Void)? = nil) {
        let animaDuration: Double = animated ? 0.3 : 0
        UIView.animate(withDuration: animaDuration, animations: {
            self.alpha = 0
        }, completion: { finished in
            
            self.removeFromSuperview()
            if let completion = completion {
                completion(finished)
            }
