寫在前面
RAC不是什么新鮮的概念了,這段時(shí)間閑來(lái)無(wú)事,就把自己項(xiàng)目中使用到的網(wǎng)絡(luò)請(qǐng)求嘗試用RAC封裝了一下。
封裝網(wǎng)絡(luò)請(qǐng)求
RAC的核心是信號(hào),在封裝網(wǎng)絡(luò)請(qǐng)求的過程中,把每一個(gè)網(wǎng)絡(luò)請(qǐng)求封裝成一個(gè)信號(hào)。
+ (RACSignal *)GET:(NSString *)url parameters:(id)parameters isCache:(BOOL)isCache;
+ (RACSignal *)POST:(NSString *)url parameters:(id)parameters isCache:(BOOL)isCache;
項(xiàng)目中常用的就是這兩個(gè)網(wǎng)絡(luò)請(qǐng)求方法,這兩個(gè)方法的實(shí)現(xiàn)也很簡(jiǎn)單。
+ (RACSignal *)GET:(NSString *)url parameters:(id)parameters isCache:(BOOL)isCache {
/// 創(chuàng)建信號(hào)
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
/// 讀緩存的數(shù)據(jù)
isCache ? [subscriber sendNext:[[XKCache sharedInstance] httpCacheForURL:url parameters:parameters]] : nil;
/// 基于AFNetworking發(fā)起網(wǎng)絡(luò)請(qǐng)求
NSURLSessionDataTask *task = [_sessionManager GET:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
/// 請(qǐng)求成功
[subscriber sendNext:responseObject];
[subscriber sendCompleted];
/// 記錄緩存數(shù)據(jù)
isCache ? [[XKCache sharedInstance] setHttpCache:responseObject URL:url parameters:parameters] : nil;
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[subscriber sendError:error];
}];
/// 當(dāng)信號(hào)被銷毀的時(shí)候 取消網(wǎng)絡(luò)請(qǐng)求
return [RACDisposable disposableWithBlock:^{
[task cancel];
}];
}];
return signal;
}
大致的思路就是樣的,網(wǎng)絡(luò)層的封裝思路參照的是PPNetworkHelper。當(dāng)然,你也可以點(diǎn)擊這里下載Demo工程,查看具體的封裝細(xì)節(jié)。
如何使用
在需要做網(wǎng)絡(luò)請(qǐng)求的地方
RACDisposable *disposable = [[XKNetworkingManager GET:@"" parameters:nil isCache:YES] subscribeNext:^(id _Nullable x) {
// 網(wǎng)絡(luò)請(qǐng)求成功 如果isCache為YES 這個(gè)block會(huì)走兩次 第一次回來(lái)的是緩存數(shù)據(jù) 第二次是請(qǐng)求成功的數(shù)據(jù)。
} error:^(NSError * _Nullable error) {
// 出錯(cuò)
} completed:^{
// 信號(hào)完成 執(zhí)行完這個(gè)之后信號(hào)會(huì)銷毀
}];
如果想要取消這個(gè)網(wǎng)絡(luò)請(qǐng)求,調(diào)用[disposable dispose]。這里有點(diǎn)需要注意的是,調(diào)用[task cancel]是會(huì)走AFNetworking失敗的回調(diào)的。但是,在外界是收不到取消網(wǎng)絡(luò)請(qǐng)求的這個(gè)失敗的。因?yàn)樵谕饨缛∠@個(gè)網(wǎng)絡(luò)請(qǐng)求的時(shí)候是銷毀的信號(hào)。信號(hào)銷毀了就不會(huì)再繼續(xù)發(fā)送了,所以也訂閱不到了。這里不知道有沒有更好的處理方式。