美文网首页
AFNetworking 中 GCD 的使用(1)

AFNetworking 中 GCD 的使用(1)

作者: 老猫_2017 | 来源:发表于2020-01-15 10:46 被阅读0次

    AFNetworkReachabilityManager 负责监听网络状态

    异步到主线程,通知在主线程发送 通知的发送,接受只能在自己的线程中

    static void AFPostReachabilityStatusChange(SCNetworkReachabilityFlags flags, AFNetworkReachabilityStatusCallback block) {
        AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags);
        dispatch_async(dispatch_get_main_queue(), ^{
            AFNetworkReachabilityManager *manager = nil;
            if (block) {
                manager = block(status);
            }
            NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
            NSDictionary *userInfo = @{ AFNetworkingReachabilityNotificationStatusItem: @(status) };
            [notificationCenter postNotificationName:AFNetworkingReachabilityDidChangeNotification object:manager userInfo:userInfo];
        });
    }
    

    保证多线程安全只初始化一次

    + (instancetype)sharedManager {
        static AFNetworkReachabilityManager *_sharedManager = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _sharedManager = [self manager];
        });
    
        return _sharedManager;
    }
    

    global queue 队列获取网络状态,之后在AFPostReachabilityStatusChange 中,转入main thread 发送通知

    - (void)startMonitoring {
      
        ...
        SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,        0),^{
            SCNetworkReachabilityFlags flags;
            if (SCNetworkReachabilityGetFlags(self.networkReachability, &flags)) {
                AFPostReachabilityStatusChange(flags, callback);
            }
        });
    }
    

    总结:此文件对GCD的使用比较简单,只是保证一次初始化,异步到主线程队列

    相关文章

      网友评论

          本文标题:AFNetworking 中 GCD 的使用(1)

          本文链接:https://www.haomeiwen.com/subject/upxtzctx.html