Another tip I would add is that messages sent to observeValueForKeyPath:ofObject:change:context: may not occur on the main thread.<p>For example, if you have multiple operations in an NSOperationQueue (like web service requests), and one of those operations updates a property on the object being observed, the observing method is called on that operation's thread. This can cause issues if the observing method needs to update the GUI. In this case, you'd need to use GCD to make sure the contents of the listening method execute on main thread (or alternatively, make sure the object's property is updated on the main thread).