Alamofire-5.0.0 以上報錯

摘要

Alamofire 更新到新版本時,遇到了兩個錯誤❌和一個警告⚠️,所以記錄下來它們,以及如何解決它們。給其他出現類似問題的同道一些解決的方向。

今天新開啟一個項目,因為網絡請求選擇 Alamofire 第三方庫處理,所以就在項目中通過 Pod 引入 Alamofire,把上個項目關於 Alamofire 的封裝代碼給放到這個項目中,問題就這樣來了。

首先遇到的報錯提示就是 Module ‘Alamofire’ has no member named ‘request’

這就非常鬱悶了,代碼在之前的項目裏面是沒有這個錯誤的,但是竟然在新的項目中報錯。就對比一下兩個項目中的 Alamofire 的版本,發現新項目中的版本是 5.4.3,比之前的項目的 Alamofire 高。

到了這一步,最直接的解決方法就是在新項目中的 Alamofire 版本設置為之前低於 5.0.0 版本,重新 Pod 一下。問題就解決了。

但是既然新版本 Alamofire 不支持這樣的使用方式,那就用新的方式來調用,也算是學習一下。

當在新版本 Alamofire 代碼中搜索 request ,看到這個方法在 Session 的類中,同時在看 Alamofire.swift 文件的時候,除了表明版本號,還定義了一個 Session 的常量:

public let AF = Session.default

所以,就用 AF 來替換就解決了。

// 舊的代碼
Alamofire.request(...)

// 新的代碼
AF.request(...)

之後就有一個關於設置 headers 的警告⚠️,雖然不是報錯,但是如果不處理,headers 的設置都是無效的。

alamofire-image1

因為我之前設置的 headers 對象是用 NSMutableDictionary 的:

let headers = NSMutableDictionary(
    dictionary: ["Accept":"application/json",
                 "Content-Type":"application/json"]
)

看警告裏面是需要有 HTTPHeaders 類型的數據,所以就追進去看一下 HTTPHeaders 的結構,發現這裏面還有一個 HTTPHeader 類型:

private var headers: [HTTPHeader] = []

裏面還有關於初始化、添加、刪除相關的方法,感興趣的可以追進去看看,這裡說明消除警告⚠️的處理。我是這樣處理的:

var headers = HTTPHeaders(
    [HTTPHeader.accept("application/json"),
    HTTPHeader.contentType("application/json")]
)

如果想要添加一個新的 HTTPHeader 類型數據時候,可以這樣處理:

headers.add(
    HTTPHeader(name: "mw-jwt", value: MyUserDefaults.instance.token)
)

初始化和添加方法不止這一種,如果感興趣,可以看一下源碼,說不定有不同的感悟。

如果在請求之後使用 responseJSON 函數將結果轉換為 JSON 格式時,就會發現當使用 response.result 數據就會報錯 ‘isSuccess’ is inaccessible due to ‘internal’ protection level 等等一些

排查之後發現凡是 response.result 的屬性變量都無法訪問,那麼在 response 中有兩個屬性變量來替換:

// 正確結果的變量
public var value: Success? { result.success }

// 錯誤結果的變量
public var error: Failure? { result.failure }

就是將 isSuccess 的判斷,直接更換為對 error == nil 判斷處理。

到這裡,已經解決了老版本更新為新版本 Alamofire 請求代碼中的兩個錯誤❌和一個警告⚠️。看後面還會出現什麼問題,再給大家說。

題外話

時間倉促,說的東西可能不全面,在你查看的過程中遇到什麼問題,評論區給我留言,我會儘快回復

Tags: