Thankfully, the System Configuration framework provides a set of APIs for monitoring reachability changes asynchronously.
static void ReachabilityCallback( SCNetworkReachabilityRef target, SCNetworkConnectionFlags flags, void *context)
{
// ...
}
SCNetworkReachabilityContext context = {0, NULL, NULL, NULL, NULL};
SCNetworkReachabilitySetCallback(networkReachability, ReachabilityCallback,
&context));
SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(),
kCFRunLoopCommonModes));