美文网首页
HYBNetworking阅读笔记

HYBNetworking阅读笔记

作者: Heikki_ | 来源:发表于2017-07-06 18:32 被阅读80次

    如题:本篇是对于HYBNetworking的阅读学习笔记

    HYBNetworking是基于AFN 的二次封装,
    1.实现了 POST,GET, 上传图片,上传文件,下载文件功能.
    2.提供了数据缓存的简单策略
    3.可以设置 baseURL,最大并发数,过期时间,

    特点:基于 OC, 使用类方法请求.基础,入门级.

    同样的BaseUrl 用一个 manager
    //MARK:BaseUrl
    /*
     *  用于指定网络请求接口的基础url,如:
     *  通常在AppDelegate中启动时就设置一次就可以了。
     
     + (void)updateBaseUrl:(NSString *)baseUrl;
     + (NSString *)baseUrl;
     
     sg_privateNetworkBaseUrl
     static NSString *sg_privateNetworkBaseUrl = nil;
     -> 接收baseUrl
     
     sg_isBaseURLChanged
     static BOOL sg_isBaseURLChanged = YES;
     ->记录 baseUrl 是否改变,
     发生改变在 + (AFHTTPSessionManager *)manager 方法中会重新生成并设置一个新个 session ,
     未发生改变就使用之前的 session
     */
    
    + (void)updateBaseUrl:(NSString *)baseUrl {
        if (![baseUrl isEqualToString:sg_privateNetworkBaseUrl] && baseUrl && baseUrl.length) {
            sg_isBaseURLChanged = YES;
        } else {
            sg_isBaseURLChanged = NO;
        }
        sg_privateNetworkBaseUrl = baseUrl;
    }
    + (NSString *)baseUrl {
        return sg_privateNetworkBaseUrl;
    }
    
    //MARK:timeout
    /**
     * 设置请求超时时间,默认为60秒
     * @param timeout 超时时间
     static NSTimeInterval sg_timeout = 60.0f;
     *在实例化 manager 方法中设置 这应该会导致一个问题 在同一个 baseURL下 更换 timeout是无效的,因为 manager 是同一个,而timeout也只是在实例化 manager时设置了一次.当然这个属性也大概设置一次也就够了吧
     manager.requestSerializer.timeoutInterval = sg_timeout;
     */
    + (void)setTimeout:(NSTimeInterval)timeout;
    

    关于网络可达性

    关于可达性监测,在 apple官网有示例代码:https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html

    //MARK:shouldObtain
    /**
     * 当检查到网络异常时,是否从从本地提取数据。默认为NO。一旦设置为YES,当设置刷新缓存时,
     *  若网络异常也会从缓存中读取数据。同样,如果设置超时不回调,同样也会在网络异常时回调,除非
     *  本地没有数据!
     *
     */
    + (void)obtainDataFromLocalWhenNetworkUnconnected:(BOOL)shouldObtain;
    /**
     * 在设置改属性的时候会进行一次可达性的测试 获取到网络状态
     * 可达性测试也只是在设置 shouldObtain 属性时进行了一次检查,这.应该.有问题.比如在检测的时候是 wifi 状态,在我请求的时候没有网络.那.怎么办,如果每次请求前都做一次可达性检查,性能会不会有影响
     * HYB中使用方法如下:
     */
    
    typedef NS_ENUM(NSInteger, HYBNetworkStatus) {
        kHYBNetworkStatusUnknown          = -1,//未知网络
        kHYBNetworkStatusNotReachable     = 0,//网络无连接
        kHYBNetworkStatusReachableViaWWAN = 1,//2,3,4G网络
        kHYBNetworkStatusReachableViaWiFi = 2,//WIFI网络
    };
    
    + (void)detectNetwork {
        AFNetworkReachabilityManager *reachabilityManager = [AFNetworkReachabilityManager sharedManager];
        
        [reachabilityManager startMonitoring];
        [reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            if (status == AFNetworkReachabilityStatusNotReachable){
                sg_networkStatus = kHYBNetworkStatusNotReachable;
            } else if (status == AFNetworkReachabilityStatusUnknown){
                sg_networkStatus = kHYBNetworkStatusUnknown;
            } else if (status == AFNetworkReachabilityStatusReachableViaWWAN){
                sg_networkStatus = kHYBNetworkStatusReachableViaWWAN;
            } else if (status == AFNetworkReachabilityStatusReachableViaWiFi){
                sg_networkStatus = kHYBNetworkStatusReachableViaWiFi;
            }
        }];
    }
    
    
    在网络不可达是是否缓存数据
    //MARK:sg_cacheGet && sg_cachePost
    /**
     *
     * 默认只缓存GET请求的数据,对于POST请求是不缓存的。如果要缓存POST获取的数据,需要手动调用设置
     *  对JSON类型数据有效,对于PLIST、XML不确定!
     * @param isCacheGet
     * @param shouldCachePost 默认为NO
     
     对应:
     static BOOL sg_cacheGet = YES;
     static BOOL sg_cachePost = NO;
     
     sg_cacheGet,sg_cachePost
     会在进行网络请求之前使用,判断其值和 HYBNetworkStatus 决定是发起请求 还是提取本地缓存数据
     会在网络请求成功之后使用,决定是否缓存数据到本地
     
     */
    + (void)cacheGetRequest:(BOOL)isCacheGet shoulCachePost:(BOOL)shouldCachePost;
    
    配置请求格式
    //MARK:配置请求格式
    /*
     *  配置请求格式,默认为JSON。如果要求传XML或者PLIST,请在全局配置一下
     *  @param requestType 请求格式,默认为JSON
     *  @param responseType 响应格式,默认为JSO,
     *  @param shouldAutoEncode YES or NO,默认为NO,是否自动encode url
     *  @param shouldCallbackOnCancelRequest 当取消请求时,是否要回调,默认为YES
     */
    + (void)configRequestType:(HYBRequestType)requestType
                 responseType:(HYBResponseType)responseType
          shouldAutoEncodeUrl:(BOOL)shouldAutoEncode
      callbackOnCancelRequest:(BOOL)shouldCallbackOnCancelRequest;
    
    取消请求

    在每次发起请求后吧 session 方法添加到一个数组中,已方便取消等操作

    //MARK:取消请求
    /**
     * 根据 url 请求事实上只是在遍历 allTasks 找到 [task.currentRequest.URL.absoluteString hasSuffix:url]
     [task cancel] 后移除 allTasks
     */
    + (void)cancelAllRequest;
    + (void)cancelRequestWithURL:(NSString *)url;
    
    POST && GET请求

    HYB 提供了3个 GET 方法,2个 POST 方法,但是最终都会调用同一个"全能函数"
    _requestWithUrl:refreshCache: httpMedth: params: progress: success: fail:

    //MARK:POST && GET
    
    /*!
     * GET 已全参数的为例子
     */
    + (HYBURLSessionTask *)getWithUrl:(NSString *)url
                         refreshCache:(BOOL)refreshCache
                               params:(NSDictionary *)params
                             progress:(HYBGetProgress)progress
                              success:(HYBResponseSuccess)success
                                 fail:(HYBResponseFail)fail;
    
    /**
     * POST 已全参数的为例子
     */
    + (HYBURLSessionTask *)postWithUrl:(NSString *)url
                          refreshCache:(BOOL)refreshCache
                                params:(NSDictionary *)params
                              progress:(HYBPostProgress)progress
                               success:(HYBResponseSuccess)success
                                  fail:(HYBResponseFail)fail;
    
    /**
     *  POST 和 GET 最终都是调用同一个方法 如下 httpMedth 1:get 2:post
     *  此方法是核心方法,以上都是为这个方法提供支持 本方法 212行
     */
    
    + (HYBURLSessionTask *)_requestWithUrl:(NSString *)url
                              refreshCache:(BOOL)refreshCache
                                 httpMedth:(NSUInteger)httpMethod
                                    params:(NSDictionary *)params
                                  progress:(HYBDownloadProgress)progress
                                   success:(HYBResponseSuccess)success
                                      fail:(HYBResponseFail)fail {
    
        
        /** 此方法中做了几件事
         1.处理 url 根据
            1)是否有 baseURL 2) 是否需要 encode (在请求头设置)
         2.实例化 manager
         3.判断 httpMethod 决定 POST 还是 GET
         4.判断能否链接网络, sg_cacheGet && sg_cachePost 是否 需要从本地缓存中提取数据
         5.将 sessin 放到数组中 [[self allTasks] addObject:session]; 1.用户取消请求 2.可以用于判断某个请求是否在进行中(HYB 中没有体现)
         NSURLSessionDataTask session task
         6.在成功或者失败的回调中调用 success fail 并将 session 从 [self allTasks] 中移除
         7.根据 sg_cacheGet && sg_cachePost 判断是否需要进行本地缓存数据
         */
    
    }
    
    /**
     * 上传图片 上传文件  下载文件 与以上相去不远
     */
    
    关于缓存
    /**
     *  MARK: 缓存到本地
     */
    //缓存路径
    static inline NSString *cachePath() {
        return [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/HYBNetworkingCaches"];
    }
    //MD5
    + (NSString *)hybnetworking_md5:(NSString *)string {
        if (string == nil || [string length] == 0) {
            return nil;
        }
        
        unsigned char digest[CC_MD5_DIGEST_LENGTH], i;
        CC_MD5([string UTF8String], (int)[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);
        NSMutableString *ms = [NSMutableString string];
        
        for (i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
            [ms appendFormat:@"%02x", (int)(digest[i])];
        }
        
        return [ms copy];
    }
    
    + (void)cacheResponseObject:(id)responseObject request:(NSURLRequest *)request parameters:params {
    
        /**
         *1.判断路径下有没有文件夹 没有就搞一个
         *2.url + param 进行 拼接字符串后 MD5加密 做key (缓存 data 名 拼接在路径上)
         *
         */
    //核心
    [[NSFileManager defaultManager] createFileAtPath:path contents:data attributes:nil]
    }
    /**
     * MARK: 获取缓存
     */
    
    + (id)cahceResponseWithURL:(NSString *)url parameters:params {
        id cacheData = nil;
        /**
         * 拼接路径
         * 去除缓存内容
         */
        NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];
        
        return cacheData;
    }
    
    //获取缓存总量
    + (unsigned long long)totalCacheSize;
    //设置自动清理缓存的上线
    + (void)autoToClearCacheWithLimitedToSize:(NSUInteger)mSize;
    //清除缓存
    + (void)clearCaches;
    //设置是否是 debug 模式
    + (void)enableInterfaceDebug:(BOOL)isDebug;
    
    //MARK:LOG
    #ifdef DEBUG
    #define NLog(s, ... ) NSLog( @"[%@ in line %d] ===============>%@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
    #else
    #define NLog(s, ... )
    #endif
    

    相关文章

      网友评论

          本文标题:HYBNetworking阅读笔记

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