使用 AFNetWorking 在项目中使用技巧

AFN 使用技巧

1 . AFN 网络监测

//
//  Header.h
//  AFNetworking
//
//  Created by 李超群 on 2019/5/30.
//  Copyright © 2019 AFNetworking. All rights reserved.
//

#ifndef Header_h
#define Header_h

#import <AFNetworking.h>
#ifndef startListener
#define startListener(obj) \
autoreleasepool{}; \
id <QIENetworkStatusChangeDelegate> _del = (obj); \
[[NSNotificationCenter defaultCenter] addObserver:_del selector:@selector(QIENetworkStatusDidChangeNotification:) name:AFNetworkingReachabilityDidChangeNotification object:nil];
#endif

#ifndef endListener
#define endListener(obj) \
autoreleasepool{} \
[[NSNotificationCenter defaultCenter] removeObserver:(obj) name:AFNetworkingReachabilityDidChangeNotification object:nil];
#endif

@protocol QIENetworkStatusChangeDelegate <NSObject>

/**
 AFNetworkReachabilityStatus currentStatus = [((NSNumber *)noti.userInfo[AFNetworkingReachabilityNotificationStatusItem]) integerValue];
 */
-(void)QIENetworkStatusDidChangeNotification:(NSNotification *)noti;

@end

#endif /* Header_h */

使用方式

// - 1.在需要监听网络环境变化的地方遵守 QIENetworkStatusChangeDelegate 协议

// - 2.开始监听网络环境的变化       
@startListener(self);

// - 3.停止监听网络环境的变化        
@endListener(self);

// - 4.网络环境变化的通知
- (void)QIENetworkStatusDidChangeNotification:(NSNotification *)noti{
     AFNetworkReachabilityStatus currentStatus = [((NSNumber *)noti.userInfo[AFNetworkingReachabilityNotificationStatusItem]) integerValue];
}

2. 解决网络请求回调后 VC 已经pop 回去了, self不存在了, 导致的崩溃(超级牛逼的方案, 超级超级牛逼)

// - 声明成功和失败的 callback 代码块
typedef void (^QIEBaseHTTPSessionManagerBlock)(int errorCode, NSString * _Nullable errorMessage, _Nullable id data, id self);

// - 封装的 AFN
+ (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(nullable id)parameters
                    dependOnObj:(__weak id)obj
                    completion:(QIEBaseHTTPSessionManagerBlock)completion {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    return [manager POST:requestURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
	    // - 此处本有超级牛逼的一顿操作, 就不写了, 只写主体
	    if(obj) !completion ? : completion(0, nil, responseObject, obj);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    	// - 此处本有超级牛逼的一顿操作, 就不写了, 只写主体
		if(obj) !completion ? : completion(-1, @"网络错误", nil, obj);
    }];
}

// - [总结] : 上边代码的关键 1. block 中的变量必须叫self, 2. 方法中的obj参数必须使用 __weak 修饰, 3. 在回调之前必须判断 obj是否存在; 上述代码的结果是, 当网络请求返回之前, vc先pop 回去了, vc就会先释放, 然后 callback 回来, 发现 obj == nil, 然后, 然后, 然后就没有然后了, 就不回调了!!!!! (🤩🤩🤩🤩 方案太牛逼了!!!!)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值