AFN中timeoutIntervalForRequest,timeoutIntervalForResource庐扫,timeoutInterval測試總結(jié)

NSURLSessionConfiguration

/* default timeout for requests. This will cause a timeout if no data is transmitted for the given timeout value, and is reset whenever data is transmitted. */
請求的默認(rèn)超時瞳脓。如果給定的超時值沒有傳輸數(shù)據(jù),這將導(dǎo)致超時澈侠,并且在傳輸數(shù)據(jù)時重置劫侧。

@property NSTimeInterval timeoutIntervalForRequest;

/* default timeout for requests. This will cause a timeout if a resource is not able to be retrieved within a given timeout. */
請求的默認(rèn)超時。如果在給定的超時內(nèi)無法檢索資源哨啃,這將導(dǎo)致超時烧栋。

@property NSTimeInterval timeoutIntervalForResource;

NSMutableURLRequest

/*!
@abstract Sets the timeout interval of the receiver.
@discussion The timeout interval specifies the limit on the idle
interval allotted to a request in the process of loading. The "idle
interval" is defined as the period of time that has passed since the
last instance of load activity occurred for a request that is in the
process of loading. Hence, when an instance of load activity occurs
(e.g. bytes are received from the network for a request), the idle
interval for a request is reset to 0. If the idle interval ever
becomes greater than or equal to the timeout interval, the request
is considered to have timed out. This timeout interval is measured
in seconds.
*/
設(shè)置接收器的超時間隔。
超時間隔指定加載過程中分配給請求的空閑間隔的限制拳球∩笮眨“空閑時間間隔”是指自上一個加載活動實(shí)例發(fā)生在正在加載的請求之后經(jīng)過的時間段。因此祝峻,當(dāng)發(fā)生加載活動的實(shí)例(例如魔吐,從網(wǎng)絡(luò)接收請求的字節(jié))時,請求的空閑時間間隔將重置為0莱找。如果空閑時間間隔大于或等于超時時間間隔酬姆,則認(rèn)為請求已超時。此超時間隔以秒為單位奥溺。

@property NSTimeInterval timeoutInterval;

注:

  1. AFN中設(shè)置manager.requestSerializer.timeoutInterval = timeoutInterval;最終會設(shè)置到mutableURLRequest.timeoutInterval = timeoutInterval
NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];
 NSLog(@"%.2f", mutableRequest.timeoutInterval);

這個默認(rèn)的是60秒

  1. 下述的例子是用charles把http://www.baidu.com設(shè)置為breakpoint了(超時設(shè)置)

設(shè)計(jì)一個單例

@interface RXTimeoutIntervalManager()
@property (nonatomic, strong) NSMutableArray *managerArray;
@end

- (void)addManager:(id)manager {
    @synchronized (self.managerArray) {
        [self.managerArray addObject:manager];
    }
}
- (void)removeManager:(id)manager {
    @synchronized (self.managerArray) {
        [self.managerArray removeObject:manager];
    }
}

- (id)init {
    if (self = [super init]) {
        self.managerArray = [NSMutableArray new];
    }
    return self;
}
- (void)printWithStartTime:(CFAbsoluteTime)startTime mutDic:(NSMutableDictionary *)mutDic {
    CFAbsoluteTime endTime = CFAbsoluteTimeGetCurrent();
    CFAbsoluteTime time = endTime - startTime;
    mutDic[@"cost"] = [NSString stringWithFormat:@"%.5f", time];
    NSMutableArray *ary = [NSMutableArray new];
    // 手動按照這個順序輸出
    NSArray *keyArray = @[@"cost", @"timeoutRequest", @"timeoutResource", @"timeout"];
    for (NSString *key in keyArray) {
        [ary addObject:[NSString stringWithFormat:@"%@=%@", key, mutDic[key]]];
    }
    printf("%s\n", [[ary componentsJoinedByString:@","] UTF8String]);
}
+ (instancetype)sharedInstance
{
    static id sharedInstance = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

核心的測試函數(shù)

- (void)_test_timeoutRequest:(NSTimeInterval)timeoutRequest timeoutResource:(NSTimeInterval)timeoutResource timeout:(NSTimeInterval)timeout {
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    if (timeoutRequest > 0) {
        config.timeoutIntervalForRequest = timeoutRequest;
    }
    if (timeoutResource > 0) {
        config.timeoutIntervalForResource = timeoutResource;
    }
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    if (timeout > 0) {
        manager.requestSerializer.timeoutInterval = timeout;
    }
    [self addManager:manager];
    NSMutableDictionary *mutDic = [NSMutableDictionary new];
    mutDic[@"timeoutRequest"] = @(timeoutRequest);
    mutDic[@"timeoutResource"] = @(timeoutResource);
    mutDic[@"timeout"] = @(timeout);
    CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();
    __weak typeof(self) weakSelf = self;
    [manager GET:@"http://www.baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        [weakSelf printWithStartTime:startTime mutDic:mutDic];
        [weakSelf removeManager:manager];
     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         [weakSelf printWithStartTime:startTime mutDic:mutDic];
         [weakSelf removeManager:manager];
         NSLog(@"error:%@", error);
     }];
}

測試不設(shè)置任何值的時候

- (void)_test_zero {
    [self _test_timeoutRequest:0 timeoutResource:0 timeout:0];
}
cost=60.02540,timeoutRequest=0,timeoutResource=0,timeout=0

如果沒有設(shè)置任何值那么超時時間是60秒

測試1個值

- (void)_test_one {
    [self _test_timeoutRequest:3 timeoutResource:0 timeout:0];
    [self _test_timeoutRequest:0 timeoutResource:3 timeout:0];
    [self _test_timeoutRequest:0 timeoutResource:0 timeout:3];
}
cost=3.15270,timeoutRequest=0,timeoutResource=3,timeout=0
cost=3.17170,timeoutRequest=3,timeoutResource=0,timeout=0
cost=3.15597,timeoutRequest=0,timeoutResource=0,timeout=3

很明顯辞色,那唯一的一個值起作用

測試2個值

- (void)_test_two {
    [self _test_timeoutRequest:3 timeoutResource:6 timeout:0];
    [self _test_timeoutRequest:6 timeoutResource:3 timeout:0];
    [self _test_timeoutRequest:0 timeoutResource:3 timeout:6];
    [self _test_timeoutRequest:0 timeoutResource:6 timeout:3];
    [self _test_timeoutRequest:3 timeoutResource:0 timeout:6];
    [self _test_timeoutRequest:6 timeoutResource:0 timeout:3];
}
1. cost=3.00128,timeoutRequest=6,timeoutResource=3,timeout=0
2. cost=3.01349,timeoutRequest=0,timeoutResource=3,timeout=6
3. cost=3.01761,timeoutRequest=0,timeoutResource=6,timeout=3
4. cost=3.01677,timeoutRequest=6,timeoutResource=0,timeout=3
5. cost=3.03217,timeoutRequest=3,timeoutResource=6,timeout=0
6. cost=6.01479,timeoutRequest=3,timeoutResource=0,timeout=6

結(jié)果1與結(jié)果5可知,如果只設(shè)置了timeoutRequesttimeoutResource浮定,那么取最小值
結(jié)果2與結(jié)果3可知相满,如果只設(shè)置了timeoutResourcetimeout,那么取最小值
結(jié)果4與結(jié)果6可知桦卒,如果只設(shè)置了timeoutRequesttimeout立美,那么只取timeout,也就是說timeout優(yōu)先級比timeoutRequest

測試3個值

- (void)_test_three {
    [self _test_timeoutRequest:3 timeoutResource:6 timeout:9];
    [self _test_timeoutRequest:3 timeoutResource:9 timeout:6];
    [self _test_timeoutRequest:6 timeoutResource:3 timeout:9];
    [self _test_timeoutRequest:6 timeoutResource:9 timeout:3];
    [self _test_timeoutRequest:9 timeoutResource:3 timeout:6];
    [self _test_timeoutRequest:9 timeoutResource:6 timeout:3];
}
cost=3.00077,timeoutRequest=9,timeoutResource=3,timeout=6
cost=3.00263,timeoutRequest=6,timeoutResource=3,timeout=9
cost=3.03130,timeoutRequest=6,timeoutResource=9,timeout=3
cost=3.02951,timeoutRequest=9,timeoutResource=6,timeout=3
cost=6.02499,timeoutRequest=3,timeoutResource=6,timeout=9
cost=6.05182,timeoutRequest=3,timeoutResource=9,timeout=6

根據(jù)測試2個值的結(jié)論和這里的輸出結(jié)果可以得知:如果設(shè)置了3個值闸盔,那么超時時間是timeoutResourcetimeout中的較小值

結(jié)論

  1. 設(shè)置了NSURLRequest timeoutInterval
    忽略timeoutIntervalForRequest設(shè)置悯辙,超時時間是timeoutIntervalForResourcetimeoutInterval較小的值。
  2. 沒有設(shè)置NSURLRequest timeoutInterval
    超時時間是timeoutIntervalForRequest躲撰、timeoutIntervalForResource較小的值针贬。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拢蛋,隨后出現(xiàn)的幾起案子桦他,更是在濱河造成了極大的恐慌,老刑警劉巖谆棱,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件快压,死亡現(xiàn)場離奇詭異,居然都是意外死亡垃瞧,警方通過查閱死者的電腦和手機(jī)蔫劣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來个从,“玉大人脉幢,你說我怎么就攤上這事∴氯瘢” “怎么了嫌松?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奕污。 經(jīng)常有香客問我萎羔,道長,這世上最難降的妖魔是什么碳默? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任贾陷,我火速辦了婚禮,結(jié)果婚禮上腻窒,老公的妹妹穿的比我還像新娘昵宇。我一直安慰自己,他們只是感情好儿子,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布瓦哎。 她就那樣靜靜地躺著,像睡著了一般柔逼。 火紅的嫁衣襯著肌膚如雪蒋譬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天愉适,我揣著相機(jī)與錄音犯助,去河邊找鬼。 笑死维咸,一個胖子當(dāng)著我的面吹牛剂买,可吹牛的內(nèi)容都是我干的惠爽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼瞬哼,長吁一口氣:“原來是場噩夢啊……” “哼婚肆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坐慰,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤较性,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后结胀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赞咙,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年糟港,在試婚紗的時候發(fā)現(xiàn)自己被綠了攀操。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡秸抚,死狀恐怖崔赌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耸别,我是刑警寧澤,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布县钥,位于F島的核電站秀姐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏若贮。R本人自食惡果不足惜省有,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谴麦。 院中可真熱鬧蠢沿,春花似錦、人聲如沸匾效。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽面哼。三九已至野宜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魔策,已是汗流浹背匈子。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闯袒,地道東北人虎敦。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓游岳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親其徙。 傳聞我的和親對象是個殘疾皇子胚迫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評論 2 348

推薦閱讀更多精彩內(nèi)容