 
     public override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
         didSelectRow?(indexPath.row)
+    }
+
+    // MARK: - ScrollViewDelegate
+
+    public override func scrollViewWillBeginDragging(scrollView: UIScrollView) {
+        isScrolling = true
+    }
+
+    public override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
+        if !decelerate {
+            isScrolling = false
+        }
+    }
+
+    public override func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
+        isScrolling = false
     }
 
     // MARK: - Public

        }
    }

    private func updateFooter(show: Bool) {
        guard let footerSection = sectionTypes.indexOf(.Footer) else {
            return
        }


        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
            self.fetchSourceObjects() { [weak self] sourceObjects, hasNext in

                // Prevent data mismatch when cleared existing data while fetching new data
                if oldDataCount == self?.sourceObjects.count {
                    self?.sourceObjects += sourceObjects
                }

                if self?.isScrolling == true {
                    if self?.pendingProcess == nil {
                        self?.pendingProcess = {
                            self?.updateTable(reload: reload, hasNext: hasNext)
                        }
                    }
                } else {
                    self?.updateTable(reload: reload, hasNext: hasNext)
                }

                self?.isRequesting = false
