/// 網(wǎng)絡(luò)請求&重用機制
/// - Parameters:
/// - target: target description
/// - model: model description
/// - delay: delay description
/// - max: max description
/// - callbackQueue: callbackQueue description
/// - progress: progress description
/// - completion: completion description
static func cz_request<T: BaseMappable>(target: TargetType,
model: T.Type,
delay: Double = 3,
max: Int = 3,
callbackQueue: DispatchQueue? = .none,
progress: ProgressBlock? = .none,
completion: @escaping (_ result: Result<T, CZError>) -> Void) {
cz_provider.request(MultiTarget(target), callbackQueue: callbackQueue, progress: progress) { (result) in
switch result {
case let .success(response):
do {
let _ = try response.filterSuccessfulStatusCodes()
} catch {
completion(.failure(CZError("數(shù)據(jù)獲取失敗")))
}
do {
let jsonDict = try response.mapJSON()
if let model = Mapper<T>(context: nil).map(JSONObject: jsonDict) {
completion(.success(model))
} else {
completion(.failure(CZError("數(shù)據(jù)解析失敗")))
}
} catch {
completion(.failure(CZError("json格式有誤")))
}
case .failure(_):
if max == 1 {
completion(.failure(CZError("似乎已斷開與互聯(lián)網(wǎng)的連接")))
} else { // 重試
DispatchQueue(label: "com.request.queue", attributes: .concurrent).asyncAfter(deadline: DispatchTime.now() + delay) {
cz_request(target: target, model: model, delay: delay, max: max - 1, completion: completion)
}
}
}
}
}
/// 網(wǎng)絡(luò)請求&重用機制(RxSwift)
/// - Parameters:
/// - target: target description
/// - model: model description
/// - delay: delay description
/// - max: max description
/// - callbackQueue: callbackQueue description
/// - progress: progress description
static func cz_request<T: BaseMappable>(target: TargetType,
model: T.Type,
delay: Double = 3,
max: Int = 3,
callbackQueue: DispatchQueue? = .none,
progress: ProgressBlock? = .none) -> Single<T> {
return Single.create { single in
let cancellableToken = cz_provider.request(MultiTarget(target), callbackQueue: callbackQueue, progress: progress) { result in
switch result {
case let .success(response):
do {
let _ = try response.filterSuccessfulStatusCodes()
} catch {
single(.error(CZError("數(shù)據(jù)獲取失敗")))
}
do {
let jsonDict = try response.mapJSON()
if let model = Mapper<T>(context: nil).map(JSONObject: jsonDict) {
single(.success(model))
} else {
single(.error(CZError("數(shù)據(jù)解析失敗")))
}
} catch {
single(.error(CZError("json格式有誤")))
}
case .failure(_):
single(.error(CZError("似乎已斷開與互聯(lián)網(wǎng)的連接")))
}
}
return Disposables.create {
cancellableToken.cancel()
}
}.retryWhen(retryHandler(delay: Int(delay),max: max))
}
/// 重試
/// - Parameter delay: 每幾秒重試
/// - Parameter max: 最大重試次數(shù)
public func retryHandler(delay: Int = 5, max: Int = 5) -> ((Observable<Error>) -> Observable<Int>) {
return { error in
return error.enumerated().flatMap { (index, error) -> Observable<Int> in
guard index < max else {
return Observable.error(error)
}
return Observable<Int>.timer(.seconds(delay), scheduler: MainScheduler.instance)
}
}
}
iOS Moya網(wǎng)絡(luò)重試機制
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來建椰,“玉大人雕欺,你說我怎么就攤上這事∶藿悖” “怎么了屠列?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長伞矩。 經(jīng)常有香客問我笛洛,道長,這世上最難降的妖魔是什么乃坤? 我笑而不...
- 正文 為了忘掉前任苛让,我火速辦了婚禮,結(jié)果婚禮上湿诊,老公的妹妹穿的比我還像新娘蝌诡。我一直安慰自己,他們只是感情好枫吧,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宇色,像睡著了一般九杂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宣蠕,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屋休!你這毒婦竟也來了坞古?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布疏旨,位于F島的核電站很魂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏檐涝。R本人自食惡果不足惜遏匆,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谁榜。 院中可真熱鬧幅聘,春花似錦、人聲如沸窃植。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽巷怜。三九已至葛超,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間延塑,已是汗流浹背绣张。 一陣腳步聲響...