     }
     
     private func updateState(forMapView mapView: MKMapView, animated: Bool) {
-        let state: ViewState
-        switch mapView.userTrackingMode {
-        case _ where isMapViewRetrievingLocation(mapView):
-            state = .RetrievingLocation
-        case .Follow:
-            state = .TrackingLocation
-        case .FollowWithHeading:
-            state = .TrackingLocationWithHeading
-        default:
-            state = .TrackingLocationOff
-        }
-        transitionToState(state, animated: animated)
+        
+        dispatch_sync(serialQueue) {
+            let nextState: ViewState
+            switch mapView.userTrackingMode {
+            case _ where self.isMapViewRetrievingLocation(mapView):
+                nextState = .RetrievingLocation
+            case .Follow:
+                nextState = .TrackingLocation
+            case .FollowWithHeading:
+                nextState = .TrackingLocationWithHeading
+            default:
+                nextState = .TrackingLocationOff
+            }
+            self.transitionToState(nextState, animated: animated)
+        }
     }
     
     private func isMapViewRetrievingLocation(mapView: MKMapView) -> Bool {

            }
        }
        
        let compl: ((Bool) -> Void) = { _ in
            for item in itemsToChange {
                item.hidden = hidden
                item.transform = CGAffineTransformIdentity
            }
            completion?()
        }
        
        if animated {
            UIView.animateWithDuration(0.2, animations: anim, completion: compl)
        } else {
            anim()
            compl(true)

        let itemsToChange = items.filter { $0.hidden != hidden }
        
        for item in itemsToChange {
            item.layer.removeAllAnimations()
            // If the item is hidden make it visible.
            if shouldScale {
                item.transform = item.hidden ? CGAffineTransformMakeScale(0.01, 0.01) : CGAffineTransformIdentity
