面向協(xié)議的網(wǎng)絡(luò)請(qǐng)求: Bamboots

封裝 一個(gè)面向協(xié)議的網(wǎng)絡(luò)請(qǐng)求

Bamboots 是基于 Alamofire 的一系列擴(kuò)展庫(kù)璧诵,這個(gè)庫(kù) 充分的體現(xiàn)了 面向 Protocol 編程在組合設(shè)計(jì)模式中的應(yīng)用腻格。

image.png

目前我對(duì) network request 的希望是: 傳入一個(gè)請(qǐng)求體:form妒蔚,然后給我返回: 成功后的模型對(duì)象承疲、失敗后的 error 對(duì)象

let form = WeatherForm<RootModel>()
request(
            form,
            success: { (response) in
                print(response.data.three_day_forecast.count)   
        }) { (error) in
                print(error.localizedDescription)
        }

當(dāng)我們也可以根據(jù)需要來(lái)處理結(jié)果焰络,有時(shí)候我們對(duì)請(qǐng)求成功后的結(jié)果感興趣鸥滨,有時(shí)候我們需要對(duì)請(qǐng)求失敗后的 error 做特殊處理:

func request<T: Codable>(
        _ form: WeatherForm<T>,
        success: ((T) -> Void)? = nil ,
        failure: ((_ error: Error) -> Void)? = nil
        )

如上的接口就能滿足我們的需要嗦哆,我們的 form 提供了所有的請(qǐng)求信息, success婿滓、 failure 兩個(gè)閉包就是我們可以根據(jù)當(dāng)前網(wǎng)絡(luò)請(qǐng)求的需要來(lái)進(jìn)行處理了老速。當(dāng)然我們對(duì)應(yīng)的閉包傳入 nil 或做缺省處理,這樣就會(huì)使用我們的默認(rèn)實(shí)現(xiàn)了凸主。然后在默認(rèn)實(shí)現(xiàn)里統(tǒng)一處理相關(guān)信息橘券,當(dāng)然這也是工程的一部分了,需要根據(jù)具體項(xiàng)目而定了卿吐。讓我們看一下 WeatherForm<RootModel>() 這個(gè)表單里面攜帶了我們網(wǎng)絡(luò)請(qǐng)求的一些條件信息旁舰,包括: apimethod嗡官、hearders箭窜、parameters, 還有我們需要返回的模型類(lèi)型RootModel 。這些信息中有些是高頻修改的衍腥,如 api磺樱、methodparameters紧阔,對(duì)于 api坊罢、method 我們通過(guò) enum 統(tǒng)一管理,對(duì)于 parameters 我們則通過(guò)屬性做map來(lái)簡(jiǎn)化請(qǐng)求參數(shù)的賦值擅耽, 而對(duì)于 hearders 這種修改頻率低的我們可以做統(tǒng)一處理,在需要修改時(shí)再添加extension實(shí)現(xiàn), 如:

extension Formable {
    public func headers() -> [String: String] {
        return ["accessToken": "xxx"]
    }
}

extension Formable where Self: RequestFormable {
    public func headers() -> [String: String] {
        return [
        "accessToken": "xxx", "fileName": "xxx",
        "App-Source": "APP",
        "User-Os": "iOS",
        ]
    }
}

extension Formable where Self: UploadFormable {
    public func headers() -> [String: String] {
        return ["accessToken": "xxx", "fileName": "xxx"]
    }
}

這里的 WeatherForm<RootModel>() 繼承了 GetForm
當(dāng)然以上這些是基于 Bamboots 而封裝的物遇。我們的 BambootsSwift 3 時(shí)是基于 AlamofireObjectMapper
的乖仇,當(dāng)然這在 Swift 4 中, 我們?nèi)《褂玫木褪?AlamofireCodable, 從命名上就可以看出來(lái)询兴,功能是一樣的乃沙,只是在 Swift 4 中我們有了 Codable 我們就可以祛除ObjectMapper了,也許不久我們直接就可以在 Alamofire 看到相應(yīng)的實(shí)現(xiàn)了诗舰,

image.png

此圖為證警儒。AlamofireCodableAlamofire 的基礎(chǔ)上為DataRequest 添加了兩個(gè)擴(kuò)展函數(shù):

/// Adds a handler to be called once the request has finished.
    ///
    /// - Parameters:
    ///   - queue:              The queue on which the completion handler is dispatched.
    ///   - keyPath:            The key path where object mapping should be performed
    ///   - completionHandler:  A closure to be executed once the request has finished and the data has been decoded by JSONDecoder.
    /// - Returns:              The request.
    @discardableResult
    public func responseObject<T: Codable>(queue: DispatchQueue? = nil, keyPath: String? = nil,  completionHandler: @escaping (DataResponse<T>) -> Void) -> Self {
        return response(queue: queue, responseSerializer: DataRequest.ObjectSerializer(keyPath), completionHandler: completionHandler)
    }

通過(guò)調(diào)用 responseObject 直接在回調(diào)中返回含有T對(duì)象的DataResponse<T>,而下面這個(gè)函數(shù)

/// Adds a handler to be called once the request has finished. T: Codable
    ///
    /// - Parameters:
    ///   - queue:              The queue on which the completion handler is dispatched.
    ///   - keyPath:            The key path where object mapping should be performed
    ///   - completionHandler:  A closure to be executed once the request has finished and the data has been decoded by JSONDecoder.
    /// - Returns:              The request.
    @discardableResult
    public func responseArray<T: Codable>(queue: DispatchQueue? = nil, keyPath: String? = nil, completionHandler: @escaping (DataResponse<[T]>) -> Void) -> Self {
        return response(queue: queue, responseSerializer: DataRequest.ObjectArraySerializer(keyPath), completionHandler: completionHandler)
    }

則提供了對(duì)數(shù)組的支持。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜀铲,一起剝皮案震驚了整個(gè)濱河市边琉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌记劝,老刑警劉巖变姨,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異厌丑,居然都是意外死亡定欧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)怒竿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)砍鸠,“玉大人,你說(shuō)我怎么就攤上這事耕驰∫瑁” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵耍属,是天一觀的道長(zhǎng)托嚣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)厚骗,這世上最難降的妖魔是什么示启? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮领舰,結(jié)果婚禮上夫嗓,老公的妹妹穿的比我還像新娘。我一直安慰自己冲秽,他們只是感情好舍咖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著锉桑,像睡著了一般排霉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上民轴,一...
    開(kāi)封第一講書(shū)人閱讀 50,043評(píng)論 1 291
  • 那天攻柠,我揣著相機(jī)與錄音,去河邊找鬼后裸。 笑死瑰钮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的微驶。 我是一名探鬼主播浪谴,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了苟耻?” 一聲冷哼從身側(cè)響起篇恒,我...
    開(kāi)封第一講書(shū)人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梁呈,沒(méi)想到半個(gè)月后婚度,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡官卡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蝗茁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寻咒。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哮翘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毛秘,到底是詐尸還是另有隱情饭寺,我是刑警寧澤,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布叫挟,位于F島的核電站艰匙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抹恳。R本人自食惡果不足惜员凝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奋献。 院中可真熱鬧健霹,春花似錦、人聲如沸瓶蚂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窃这。三九已至瞳别,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杭攻,已是汗流浹背洒试。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朴上,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓卒煞,卻偏偏與公主長(zhǎng)得像痪宰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)衣撬、插件乖订、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • 調(diào)整心態(tài),回望初心.繼續(xù)親子閱讀具练,做更好的媽媽 高調(diào)發(fā)圈乍构,贏得支持 1.高調(diào)發(fā)圈,請(qǐng)大家支持自己的事業(yè)扛点,用事業(yè)心來(lái)...
    anita19845閱讀 134評(píng)論 0 0
  • 連續(xù)三周哥遮,有幸聽(tīng)了五場(chǎng)蘇東坡的系列講座。各位專(zhuān)家從蘇東坡文學(xué)藝術(shù)上的成就陵究,為我們解讀了這位中國(guó)文化史上的全才眠饮。 蘇...
    花間星事閱讀 1,135評(píng)論 7 34
  • 2015年9月21日 第一篇,不知道該寫(xiě)些什么铜邮。不知怎么想要開(kāi)始記錄下高中僅剩下的266天了 18歲的我仪召,今年18...
    Triton閱讀 175評(píng)論 3 3
  • 2015-6-23 08:08發(fā)布在自己的qq空間 我總是習(xí)慣和別人說(shuō),我是一個(gè)人格蠻分裂的人松蒜,我覺(jué)得我的體內(nèi)寄宿...
    上官云海_一名軟件測(cè)試工程師閱讀 296評(píng)論 0 0