
該文檔的中文版本可以在此處找到。
您是一個聰明的開發人員。您可能會使用Alamofire抽象訪問URLSession以及您不真正關心的所有討厭的細節。但是,就像許多智能開發人員一樣,您可以編寫臨時網絡抽象層。它們可能被稱為“ Apimanager”或“ NetworkModel”,並且總是以眼淚結束。

iOS應用中常見的臨時網絡層是常見的。它們有幾個原因不好:
因此,Moya的基本思想是我們需要一些網絡抽象層,這些網絡抽象層充分封裝了直接調用Alamofire。常見的事物很容易,但全面,複雜的事情也很容易。
如果您使用Alamofire抽象
URLSession,為什麼不使用某些東西來抽象URL,參數等的含糊不清?
Moya的一些很棒的功能:
您可以在視覺文檔中查看有關項目方向的更多信息。
我們在存儲庫中提供了兩個示例項目。要使用它下載倉庫,請運行carthage update以下載所需的庫並打開moya.xcodeproj。您會看到兩個方案: Basic和Multi-Target - 選擇一個,然後構建並運行!這些源文件在項目導航器中的Examples目錄中。玩得開心!
該項目正在積極開發中,並正在Artsy的拍賣應用中使用。我們認為它已經準備好生產。
下面是一張表格,顯示您應將Moya的版本用於Swift版本。
| 迅速 | 莫亞 | rxmoya | 重新vivemoya | rxswift | Reactiveswift | alamofire |
|---|---|---|---|---|---|---|
| > = 5.2 | > = 15.0.0 | > = 15.0.0 | > = 15.0.0 | 6.x | 6.x | 5.x |
| 5.x | > = 14.0.0 | > = 14.0.0 | > = 14.0.0 | 5.x | 6.x | 5.x |
| 5.x | > = 13.0.0 | > = 13.0.0 | > = 13.0.0 | 4.x | 5.x | > = 4.1 |
| 4.x | 9.0.0-12.0.1 | 10.0.0-12.0.1 | 9.0.0-12.0.1 | 4.x(> = 10.0.0) | 4.x(> = 12.0.0) | 4.1(> = 11.0.0) |
| 3.x | 8.0.0-8.0.5 | 8.0.0-8.0.5 | 8.0.0-8.0.5 | - | - | - |
| 2.3 | 7.0.2-7.0.4 | 7.0.2-7.0.4 | 7.0.2-7.0.4 | - | - | - |
| 2.2 | <= 7.0.1 | <= 7.0.1 | <= 7.0.1 | - | - | - |
注意:如果您在項目中使用了Swift 4.2,但是您使用的是Xcode 10.2,即使我們使用Swift 5.0,Moya 13也應該正常工作。
升級到新的主要版本的Moya?查看我們的遷移指南。
注意:下面的說明是用於不使用XCode UI的SwiftPM 。最容易進入您的項目設置 - > Swift軟件包並從那裡添加Moya。
要使用Apple的Swift軟件包管理器集成,而無需XCode集成,請添加以下作為Package.swift的依賴性。 Swift:
. package ( url : " https://github.com/Moya/Moya.git " , . upToNextMajor ( from : " 15.0.0 " ) )然後將"Moya"指定為您希望使用Moya的目標的依賴性。如果要使用反應性擴展,請另外添加"ReactiveMoya" , "RxMoya"或"CombineMoya"作為目標依賴性。這是一個示例PackageDescription :
// swift-tools-version:5.3
import PackageDescription
let package = Package (
name : " MyPackage " ,
products : [
. library (
name : " MyPackage " ,
targets : [ " MyPackage " ] ) ,
] ,
dependencies : [
. package ( url : " https://github.com/Moya/Moya.git " , . upToNextMajor ( from : " 15.0.0 " ) )
] ,
targets : [
. target (
name : " MyPackage " ,
dependencies : [ " ReactiveMoya " ] )
]
)組合注意:如果您使用的是CombineMoya ,請確保使用Xcode 11.5.0或更高版本。借助Xcode的早期版本,您必須手動將合併為弱鏈接的框架添加到您的應用程序目標中。
ACCIO是基於SwiftPM的依賴項管理器,可以為iOS/MacOS/TVOS/WatchOS構建框架。因此,Moya的集成步驟與上述完全相同。配置Package.swift文件後,運行accio update而不是swift package update 。
對於Moya,請在您的Podfile中使用以下條目:
pod 'Moya' , '~> 15.0'
# or
pod 'Moya/RxSwift' , '~> 15.0'
# or
pod 'Moya/ReactiveSwift' , '~> 15.0'
# or
pod 'Moya/Combine' , '~> 15.0'然後運行pod install 。
在您想使用Moya的任何文件中,不要忘記使用導入import Moya該框架。
迦太基用戶可以指向此存儲庫,並使用他們想要的生成的框架, Moya , RxMoya , ReactiveMoya或CombineMoya 。
在您的Cartfile中進行以下條目:
github "Moya/Moya" ~> 15.0
然後運行carthage update --use-xcframeworks 。
如果這是您第一次在項目中使用迦太基,那麼您需要進行一些其他步驟,如迦太基的解釋。
注意:目前,迦太基不提供僅構建特定存儲庫類的方法。所有的子模型及其依賴項將使用上述命令構建。但是,您無需複制您不使用的框架。例如,如果您不使用
ReactiveSwift,請隨時在carthage update完成後,從ReactiveMoya構建目錄中刪除該框架。或者,如果您使用的是ReactiveSwift但不使用RxSwift或Combine,則可以安全刪除RxMoya,RxTest,RxCocoa,CombineMoya等。
cd到您的頂級項目目錄中,如果您的項目未初始化為GIT存儲庫,則運行以下命令: $ git init$ git submodule add https://github.com/Alamofire/Alamofire.git
$ git submodule add https://github.com/Moya/Moya.gitAlamofire文件夾,然後將Alamofire.xcodeproj拖到您應用程序Xcode Project的項目導航器中。使用Moya文件夾中的Moya.xcodeproj執行同樣的操作。它們應該嵌套在您應用程序的藍色項目圖標下方。它是否在所有其他Xcode組之上或下方都無關緊要。
xcodeproj的部署目標是否與項目Navigator中的應用程序目標相匹配。+按鈕。Alamofire.xcodeproj文件夾每個文件夾,每個文件夾都有兩個不同版本的Alamofire.framework嵌套在Products文件夾中。您選擇哪種
Products文件夾並不重要,但是無論選擇頂部或底部Alamofire.framework都很重要。
Alamofire.framework和MacOS的底部。您可以通過檢查項目的構建日誌來驗證選擇哪一個。
Alamofire的構建目標將被列為Alamofire iOS,Alamofire macOS,Alamofire tvOS或Alamofire watchOS。
再次單擊“嵌入式二進製文件”下的+按鈕,然後為Moya添加正確的構建目標。
就是這樣!
在復製文件構建階段中,這三個框架自動添加為目標依賴性,鏈接框架和嵌入式框架,這就是您在模擬器和設備上構建的全部。
設置後,使用Moya真的很簡單。您可以訪問這樣的API:
provider = MoyaProvider < GitHub > ( )
provider . request ( . zen ) { result in
switch result {
case let . success ( moyaResponse ) :
let data = moyaResponse . data
let statusCode = moyaResponse . statusCode
// do something with the response data or statusCode
case let . failure ( error ) :
// this means there was a network failure - either the request
// wasn't sent (connectivity), or no response was received (server
// timed out). If the server responds with a 4xx or 5xx error, that
// will be sent as a ".success"-ful response.
}
}這是一個基本示例。許多API請求需要參數。 Moya將其編碼為您用於訪問端點的枚舉,例如:
provider = MoyaProvider < GitHub > ( )
provider . request ( . userProfile ( " ashfurrow " ) ) { result in
// do something with the result
}在URL中不再錯字。不再缺少參數值。不再使用參數編碼的混亂。
有關更多示例,請參見文檔。
甚至涼爽的是反應性擴展。 Moya為ReactivesWift,RxSwift和Compine提供了反應性擴展。
ReactiveSwift擴展同時提供reactive.request(:callbackQueue:)和SignalProducer reactive.requestWithProgress(:callbackQueue:)的方法,即立即返回您可以啟動,綁定,映射或您想做的任何事情的方法。例如,為了處理錯誤,我們可以執行以下操作:
provider = MoyaProvider < GitHub > ( )
provider . reactive . request ( . userProfile ( " ashfurrow " ) ) . start { event in
switch event {
case let . value ( response ) :
image = UIImage ( data : response . data )
case let . failed ( error ) :
print ( error )
default :
break
}
} RxSwift擴展名也提供rx.request(:callbackQueue:)和rx.requestWithProgress(:callbackQueue:)方法,但是兩者的返回類型都不同。如果是普通的rx.request(:callbackQueue) ,返回類型是Single<Response> ,它會發出單個元素或錯誤。如果rx.requestWithProgress(:callbackQueue:) ,返回類型是Observable<ProgressResponse> ,因為我們可能會從進度中獲得多個事件,而最後一個事件是響應。
例如,為了處理錯誤,我們可以執行以下操作:
provider = MoyaProvider < GitHub > ( )
provider . rx . request ( . userProfile ( " ashfurrow " ) ) . subscribe { event in
switch event {
case let . success ( response ) :
image = UIImage ( data : response . data )
case let . error ( error ) :
print ( error )
}
}除了使用信號代替回調塊的選項外,還有一系列用於RXSWIFT和REATIONVIFT的信號運算符,它們將嘗試將從網絡響應收到的數據映射到帶有mapImage() ,Mapjson(), mapJSON()和mapString()的json或一個字符串中。如果映射不成功,您將在信號上遇到錯誤。您還可以獲得濾除某些狀態代碼的方便方法。這意味著您可以將代碼放置在與處理無效響應的代碼相同的位置中處理API錯誤。
Combine擴展程序提供requestPublisher(:callbackQueue:)和requestWithProgressPublisher(:callbackQueue)返回AnyPublisher<Response, MoyaError>和AnyPublisher<ProgressResponse, MoyaError> 。
這是requestPublisher用法的一個示例:
provider = MoyaProvider < GitHub > ( )
let cancellable = provider . requestPublisher ( . userProfile ( " ashfurrow " ) )
. sink ( receiveCompletion : { completion in
guard case let . failure ( error ) = completion else { return }
print ( error )
} , receiveValue : { response in
image = UIImage ( data : response . data )
} ) Moya周圍有一個很棒的社區,有些人創造了一些非常有用的擴展。
嘿!你喜歡莫亞嗎?驚人的!我們實際上可以真正利用您的幫助!
開源不僅僅是編寫代碼。 Moya可以在以下任何方面使用您的幫助:
如果這聽起來很酷,請發送拉動請求!在您的第一個貢獻之後,我們會將您添加為存儲庫的成員,以便您可以合併拉的請求並幫助引導船?您可以在我們的撰稿人指南中閱讀有關此信息的更多詳細信息。
Moya的社區具有巨大的積極能量,並且維護者致力於保持事物的棒極。就像在可可蛋糕社區中一樣,始終承擔積極的意圖。即使評論聽起來很刻薄,也會給該人帶來懷疑的好處。
請注意,該項目已使用貢獻者的行為準則發布。通過參加該項目,您同意遵守其條款。
如果您從Moya添加或刪除了源文件,則需要對Moya.xcodeproj項目進行相應的更改,該項目的根源是該存儲庫的根。該項目用於迦太基。不用擔心,如果您忘記了拉動請求時,您會收到自動警告。
無論您是核心成員還是第一次嘗試的用戶,都可以通過改進文檔為Moya做出寶貴的貢獻。幫助我們:
Moya是根據MIT許可發布的。有關更多信息,請參見License.MD。