AFNetworing同步網(wǎng)絡(luò)請(qǐng)求?

今天遇到了一個(gè)有關(guān)同步網(wǎng)絡(luò)請(qǐng)求的需求是這樣的,App中所有網(wǎng)絡(luò)請(qǐng)求都需要使用一個(gè)BaseUrl作為前綴,這個(gè)前綴需要一個(gè)專(zhuān)門(mén)的配置接口去請(qǐng)求獲取??紤]到如果在App啟動(dòng)的時(shí)候異步請(qǐng)求配置接口獲取BaseUrl,并不能保證APP首頁(yè)發(fā)起的網(wǎng)絡(luò)請(qǐng)求前綴是正確的BaseUrl,于是我考慮采用同步請(qǐng)求的方法確保BaseUrl的獲取。

因?yàn)槲覀冊(cè)陂_(kāi)發(fā)App的時(shí)候常用的網(wǎng)絡(luò)框架就是AFNetWorking ,于是我首先想到了使用AFNetworking結(jié)合信號(hào)量的方式來(lái)實(shí)現(xiàn)這個(gè)同步請(qǐng)求,代碼如下:

//更新系統(tǒng)配置,獲取BaseUrl的方法,在App啟動(dòng)時(shí)候調(diào)用
- (void)updateAppSystemConfig{
    //1.創(chuàng)建信號(hào)量,阻塞了主線程
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //這里省略了AFN請(qǐng)求網(wǎng)絡(luò)的方法,成功和失敗的回調(diào)里都需要調(diào)用下面的代碼
        //2.網(wǎng)絡(luò)請(qǐng)求結(jié)束,發(fā)送通知信號(hào)
        //dispatch_semaphore_signal(semaphore);
    });
    // 3.發(fā)送等待信號(hào)
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    //同步請(qǐng)求配置結(jié)束之后,結(jié)束阻塞
}

但是上述的代碼卻無(wú)形中造成了死鎖的問(wèn)題。這是因?yàn)槲覀兪褂肎CD的信號(hào)量首先阻塞了主線程,而是在異步線程里使用了AFN請(qǐng)求網(wǎng)絡(luò),由于AFN自身的原因,無(wú)論還是成功還是失敗網(wǎng)絡(luò)請(qǐng)求的響應(yīng)總是要回到主線程中進(jìn)行操作,但是此時(shí)的主線程卻是阻塞的,所以就互相等待就造成了死鎖。

然后我就采用了系統(tǒng)自帶的網(wǎng)絡(luò)請(qǐng)求的方法來(lái)解決這個(gè)問(wèn)題,代碼如下:

//更新系統(tǒng)配置,獲取BaseUrl的方法,在App啟動(dòng)時(shí)候調(diào)用
- (void)updateAppSystemConfig{
    //1.創(chuàng)建信號(hào)量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //開(kāi)始異步請(qǐng)求操作
        NSURL*url=[NSURL URLWithString:Path_app_config];
        //創(chuàng)建請(qǐng)求命令,并設(shè)置緩存策略
        NSURLRequest *request= [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];
        //創(chuàng)建會(huì)話對(duì)象通過(guò)單例方法實(shí)現(xiàn)
        NSURLSession *session=[NSURLSession sharedSession];
        //執(zhí)行會(huì)話的任務(wù)
        NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            if (error) {
                NSLog(@"請(qǐng)求配置失敗了");
            }else{
                NSDictionary *responData=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
                if ([responData[@"errcode"] integerValue] ==QQMFRequest_OK) {
                    //網(wǎng)絡(luò)請(qǐng)求成功,將新配置更新到本地,可以從配置數(shù)據(jù)中得到BaseUrl
                    [AppConfigTools updateAppConfigWithData:responData];
                }
            }
            // 2.在網(wǎng)絡(luò)請(qǐng)求結(jié)束后發(fā)送通知信號(hào)
            dispatch_semaphore_signal(semaphore);
        }];
        //開(kāi)始執(zhí)行任務(wù)
        [task resume];
    });
    // 3.發(fā)送等待信號(hào)
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    //同步請(qǐng)求配置結(jié)束之后,結(jié)束阻塞
}

這里使用的是系統(tǒng)自帶的網(wǎng)絡(luò)請(qǐng)求,請(qǐng)求系統(tǒng)配置BaseUrl的網(wǎng)絡(luò)請(qǐng)求是在異步線程里實(shí)現(xiàn)的,而且網(wǎng)絡(luò)請(qǐng)求完成之后發(fā)出信號(hào)量的通知也是在異步線程中,這樣就不會(huì)造成了阻塞。也實(shí)現(xiàn)了同步等待的需求。

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,901評(píng)論 25 709
  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP、TCP、Http、Socket、X...
    Carden閱讀 5,316評(píng)論 0 12
  • AFN什么是AFN全稱是AFNetworking,是對(duì)NSURLConnection、NSURLSession的一...
    醉葉惜秋閱讀 1,338評(píng)論 0 0
  • 時(shí)間總是那么的殘酷,讓你漸漸的看清世間百態(tài),卻又無(wú)可奈何。 有人說(shuō)人這一輩子所有的事都是上天早就注...
    碧霄幻殤閱讀 1,040評(píng)論 0 1

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