         return DynamicSettingsCellHeight * CGFloat(totalRows)
     }
 
+    private var blockedCountChangedNotification: NotificationObserver?
+    private var mutedCountChangedNotification: NotificationObserver?
+
+    deinit {
+        blockedCountChangedNotification?.removeObserver()
+        mutedCountChangedNotification?.removeObserver()
+    }
+
     override func viewDidLoad() {
         super.viewDidLoad()
+
+        blockedCountChangedNotification = NotificationObserver(notification: BlockedCountChangedNotification) { [unowned self] (userId, delta) in
+            self.currentUser?.profile?.blockedCount += delta
+            self.reloadTables()
+        }
+        mutedCountChangedNotification = NotificationObserver(notification: MutedCountChangedNotification) { [unowned self] (userId, delta) in
+            self.currentUser?.profile?.mutedCount += delta
+            self.reloadTables()
+        }
 
         tableView.scrollsToTop = false
         tableView.rowHeight = DynamicSettingsCellHeight

                self.hideLoadingHud()
            }
        )
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        // the first time this screen appears we don't want to call 'reloadTables'.  Only on subsequent
        // loads
        if appearedAlready {
            reloadTables()
        }
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        appearedAlready = true
    }

    private func reloadTables() {

}

class DynamicSettingsViewController: UITableViewController {
    var hasBlocked: Bool { return (currentUser?.profile?.blockedCount ?? 0) > 0 }
    var hasMuted: Bool { return (currentUser?.profile?.mutedCount ?? 0) > 0 }

