基于RAC封裝帶緩存的網(wǎng)絡(luò)請(qǐng)求

寫在前面

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ā)送了,所以也訂閱不到了。這里不知道有沒有更好的處理方式。

特別感謝

PPNetworkHelper

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容