             if let newValue = newValue {
                 objc_setAssociatedObject(self, &AssociatedKeys.emptyDataSetDataSource, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
 
-                swizzleMethod(selector: Selectors.reloadData)
-                if isKindOfClass(UITableView.self) {
-                    swizzleMethod(selector: Selectors.endUpdates)
+                if self is UITableView {
+                    UITableView.tb_swizzleTableViewReloadData()
+                    UITableView.tb_swizzleTableViewEndUpdates()
+                }
+                if self is UICollectionView {
+                    UICollectionView.tb_swizzleCollectionViewReloadData()
                 }
             } else {
                 handlingInvalidEmptyDataSet()

    }

    public var emptyDataViewVisible: Bool {
        get {
            if let emptyDataView = objc_getAssociatedObject(self, &AssociatedKeys.emptyDataView) as? EmptyDataView {
                return emptyDataView.hidden
            }
            return false
        }
    }

    private var emptyDataView: EmptyDataView! {
        get {
            var emptyDataView = objc_getAssociatedObject(self, &AssociatedKeys.emptyDataView) as? EmptyDataView
            if emptyDataView == nil {
                emptyDataView = EmptyDataView(frame: frame)
                emptyDataView!.autoresizingMask = [.FlexibleHeight, .FlexibleWidth]
                emptyDataView!.hidden = true

                emptyDataView!.tapGesture = UITapGestureRecognizer(target: self, action: "didTapEmptyDataView:")
                emptyDataView!.tapGesture.delegate = self
                emptyDataView!.addGestureRecognizer(emptyDataView!.tapGesture)
                setEmptyDataView(emptyDataView!)
            }
            return emptyDataView!
        }
    }

    // MARK: - Setters

    }

    // MARK: - Method swizzling
    private class func tb_swizzleMethod(originalSelector: Selector, swizzledSelector: Selector) {
        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }

    private class func tb_swizzleTableViewReloadData() {
        struct EmptyDataSetSwizzleToken {
            static var onceToken: dispatch_once_t = 0
        }
        dispatch_once(&EmptyDataSetSwizzleToken.onceToken) {
            let originalSelector = Selectors.reloadData
            let swizzledSelector = Selectors.tableViewSwizzledReloadData

            tb_swizzleMethod(originalSelector, swizzledSelector: swizzledSelector)
            print(__FUNCTION__)
        }
    }

    private class func tb_swizzleTableViewEndUpdates() {
        struct EmptyDataSetSwizzleToken {
            static var onceToken: dispatch_once_t = 0
        }
        dispatch_once(&EmptyDataSetSwizzleToken.onceToken) {
            let originalSelector = Selectors.endUpdates
            let swizzledSelector = Selectors.tableViewSwizzledEndUpdates

            tb_swizzleMethod(originalSelector, swizzledSelector: swizzledSelector)
            print(__FUNCTION__)
        }
    }

    private class func tb_swizzleCollectionViewReloadData() {
        struct EmptyDataSetSwizzleToken {
            static var onceToken: dispatch_once_t = 0
        }
        dispatch_once(&EmptyDataSetSwizzleToken.onceToken) {
            let originalSelector = Selectors.reloadData
            let swizzledSelector = Selectors.collectionViewSwizzledReloadData

            tb_swizzleMethod(originalSelector, swizzledSelector: swizzledSelector)
            print(__FUNCTION__)
        }
    }

