【Alamofire源碼解析】02 - AFError & Notifications & DispatchQueue+Alamofire

一、AFError枚舉

作者首先把整個(gè)項(xiàng)目中遇到的error都集中在AFError枚舉。從源碼中我們可以看到,項(xiàng)目中遇到的error有五大類,就是AFError的五個(gè)case,每個(gè)case都有一個(gè)關(guān)聯(lián)值(什么是關(guān)聯(lián)值 >>)。我們利用Swift枚舉的關(guān)聯(lián)值特性,在拋出錯(cuò)誤的時(shí)候,關(guān)聯(lián)一個(gè)任何類型的值。例如如果是這個(gè)錯(cuò)誤case invalidURL(url: URLConvertible),這里關(guān)聯(lián)了一個(gè)url,這樣就可以在遇到error的時(shí)候,告訴我們哪個(gè)url是不合法的。而其他四個(gè)case關(guān)聯(lián)的都是AFError里面內(nèi)置的enum類型(Swift允許類型嵌套),可以告訴我們更具體的錯(cuò)誤原因。

public enum AFError: Error {

    // 參數(shù)編碼失敗的原因
    public enum ParameterEncodingFailureReason {
    
    }

    // 多表單數(shù)據(jù)編碼失敗的原因
    public enum MultipartEncodingFailureReason {
    
    }

    // 響應(yīng)驗(yàn)證失敗的原因
    public enum ResponseValidationFailureReason {

    }

    // 響應(yīng)序列化失敗的原因
    public enum ResponseSerializationFailureReason {

    }

    // 五大類錯(cuò)誤
    case invalidURL(url: URLConvertible)
    case parameterEncodingFailed(reason: ParameterEncodingFailureReason)
    case multipartEncodingFailed(reason: MultipartEncodingFailureReason)
    case responseValidationFailed(reason: ResponseValidationFailureReason)
    case responseSerializationFailed(reason: ResponseSerializationFailureReason)
}

二、AdapterError

這個(gè)AdapterError是專門為RequestAdapter服務(wù)的。

這里先簡(jiǎn)單介紹下RequestAdapterRequestAdapter是個(gè)協(xié)議,我們可以自定義一個(gè)請(qǐng)求適配器,并且遵循這個(gè)協(xié)議。通過我們自定義的適配器,我們?cè)诎l(fā)送請(qǐng)求的時(shí)候可以默認(rèn)添加一些請(qǐng)求相關(guān)的數(shù)據(jù),具體請(qǐng)查看:【Alamofire源碼解析】08 - Request。

AdapterError就是在請(qǐng)求適配過程中可能出現(xiàn)的錯(cuò)誤的結(jié)構(gòu)類型。在Error的extension中定義的underlyingAdaptError就是適配過程中可能出現(xiàn)的錯(cuò)誤。

三、Error Booleans

這里定義了一些方便使用的只讀屬性,方便我們?cè)陂_發(fā)的時(shí)候作出判斷。其實(shí)在我們的開發(fā)中,也會(huì)經(jīng)常把一些判斷寫成只讀屬性或者是一個(gè)返回Bool的方法。這是一個(gè)非常好的習(xí)慣,提高代碼的可讀性。在Swift中,蘋果已經(jīng)習(xí)慣性地把Bool類型的屬性以is開頭命名,我個(gè)人也覺得用is開頭命名,可讀性會(huì)更高。

extension AFError {
    public var isInvalidURLError: Bool {
        if case .invalidURL = self { return true }
        return false
    }
    
    // 更多 Error Booleans ...
}

四、Convenience Properties

這部分內(nèi)容是一些方便使用的與error相關(guān)的屬性,沒有很特別的。

五、Notifications

Notifications這個(gè)文件通過擴(kuò)展Notification.Name定義了項(xiàng)目中用到的通知名稱。我們可以學(xué)習(xí)用這個(gè)形式來定義rawValueorg.alamofire.notification.name.task.didResume。另外還定義了一個(gè)Key。

六、DispatchQueue+Alamofire

DispatchQueue+Alamofire里面,通過擴(kuò)展DispatchQueue定義了不同優(yōu)先級(jí)的全局隊(duì)列:

  • userInteractive:與用戶交互的任務(wù)隊(duì)列,通常跟UI的刷新有關(guān),例如動(dòng)畫之類的
  • userInitiated:用戶發(fā)起的并且需要立即得到結(jié)果的任務(wù)隊(duì)列
  • utility:需要花點(diǎn)時(shí)間的任務(wù)隊(duì)列
  • background:后臺(tái)任務(wù)隊(duì)列,用戶不需要關(guān)心的,通常時(shí)間會(huì)比較長(zhǎng)

另外還定義了一個(gè)方法,經(jīng)過一個(gè)指定的時(shí)間后,執(zhí)行一個(gè)closure,這種寫法看起來更通熟易懂:

func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) {
    asyncAfter(deadline: .now() + delay, execute: closure)
}

有任何問題,歡迎大家留言!

歡迎加入我管理的Swift開發(fā)群:536353151,本群只討論Swift相關(guān)內(nèi)容。

原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處。謝謝!

最后編輯于
?著作權(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)容