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, 然后, 然后, 然后就没有然后了, 就不回调了!!!!! (🤩🤩🤩🤩 方案太牛逼了!!!!)