
このドキュメントの中国語版はここにあります。
あなたはスマートな開発者です。おそらく、Alamofireを使用して、 URLSessionへのアクセスと、あなたが本当に気にしないすべての厄介な詳細を抽象化します。しかし、多くのスマート開発者と同様に、アドホックネットワーク抽象化レイヤーを書きます。彼らはおそらく「アピマナゲル」または「ネットワークモデル」と呼ばれ、常に涙で終わります。

アドホックネットワークレイヤーは、iOSアプリで一般的です。彼らはいくつかの理由で悪い:
したがって、Moyaの基本的なアイデアは、実際にAlamofireを直接呼び出すのを十分にカプセル化するネットワーク抽象化レイヤーが必要だということです。一般的なものが簡単であるように十分に簡単であるはずですが、複雑なものも簡単であるため、十分に包括的です。
Alamofireを使用して
URLSessionを抽象化する場合、何かを使用して、URL、パラメーターなどの核心を抽象化してみませんか?
Moyaのいくつかの素晴らしい機能:
Vision DocumentのProject Directionの詳細については、詳細を確認できます。
リポジトリに2つのサンプルプロジェクトを提供しました。使用するには、リポジトリをダウンロードするには、 carthage updateを実行して必要なライブラリをダウンロードし、Moya.xcodeprojを開きます。 2つのスキームが表示されます: BasicとMulti-Target - 1つを選択してからビルドして実行してください!これらのソースファイルは、Project NavigatorのExamples Directoryにあります。楽しむ!
このプロジェクトは積極的に開発中であり、Artsyのオークションアプリで使用されています。生産用に使用できると考えています。
以下は、Swiftバージョンに使用するMoyaのバージョンを示すテーブルです。
| 迅速 | モヤ | rxmoya | Reactivemoya | 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を使用している場合、Moya 13はSwift 5.0を使用していても正しく機能するはずです。
モヤの新しいメジャーバージョンにアップグレードしますか?移行ガイドをご覧ください。
注:以下の手順は、Xcode UIなしでSwiftPMを使用するためのものです。プロジェクトの設定に行くのが最も簡単です - > SwiftパッケージとそこからMoyaを追加します。
Xcode IntegrationなしでAppleのSwiftパッケージマネージャーを使用して統合するには、 Package.swiftへの依存関係として以下を追加します。Swift:
. package ( url : " https://github.com/Moya/Moya.git " , . upToNextMajor ( from : " 15.0.0 " ) )そして、モヤを使用するターゲットの依存性として"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の以前のバージョンでは、アプリケーションターゲットに弱くリンクされたフレームワークとしてCombineを手動で追加する必要があります。
Accioは、iOS/MacOS/TVOS/Watchosのフレームワークを構築できるSWIFTPMに基づく依存関係マネージャーです。したがって、Moyaの統合ステップは、上記とまったく同じです。 Package.swiftファイルが構成されたら、 swift package updateの代わりにaccio 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でフレームワークをインポートすることを忘れないでください。
Carthageのユーザーは、このリポジトリを指して、 Moya 、 RxMoya 、 ReactiveMoya 、またはCombineMoyaの生成されたフレームワークを使用できます。
Cartfileで次のエントリを作成します。
github "Moya/Moya" ~> 15.0
次に、 carthage update --use-xcframeworksを実行します。
これがプロジェクトでCarthageを初めて使用する場合は、Carthageで説明されているように追加の手順を実行する必要があります。
注:現時点では、Carthageは特定のリポジトリサブモジュールのみを構築する方法を提供していません。すべてのサブモジュールとその依存関係は、上記のコマンドとともに構築されます。ただし、プロジェクトに使用していないフレームワークをコピーする必要はありません。たとえば、
ReactiveSwiftを使用していない場合は、carthage updateが完了した後、CarthageビルドディレクトリからReactiveMoyaとともにそのフレームワークを削除してください。または、ReactiveSwiftまたはCombineRxSwiftはないがRxMoya、RxTest、RxCocoa、CombineMoyaなどを使用していない場合は、安全に削除できます。
cdをトップレベルのプロジェクトディレクトリに開き、次のコマンドを実行します。 $ git init$ git submodule add https://github.com/Alamofire/Alamofire.git
$ git submodule add https://github.com/Moya/Moya.gitAlamofireフォルダーを開き、 Alamofire.xcodeprojをアプリケーションのXCodeプロジェクトのプロジェクトナビゲーターにドラッグします。 MoyaフォルダーのMoya.xcodeprojでも同じことをします。それらは、アプリケーションのBlue Projectアイコンの下にネストされているように見える必要があります。他のすべてのXcodeグループの上または下にあるかどうかは重要ではありません。
xcodeprojの展開ターゲットがプロジェクトナビゲーターのアプリケーションターゲットの展開と一致することを確認します。+ボタンをクリックします。Alamofire.xcodeprojフォルダーが表示されます。それぞれ、2つの異なるバージョンのAlamofire.frameworkがProductsフォルダー内にネストされています。どの
Productsフォルダーから選択したかは関係ありませんが、上部または下部のAlamofire.frameworkを選択するかどうかは関係ありません。
Alamofire.frameworkを選択し、macosの下部を選択します。プロジェクトのビルドログを検査することにより、選択したものを確認できます。
Alamofireのビルドターゲットは、Alamofire iOS、Alamofire macOS、Alamofire tvOS、またはAlamofire watchOSのいずれかとしてリストされます。
「埋め込みバイナリ」の下の+ボタンをもう一度クリックし、 Moyaの正しいビルドターゲットを追加します。
そしてそれだけです!
3つのフレームワークは、ターゲット依存関係、リンクされたフレームワーク、およびコピーファイルのビルドフェーズに組み込まれたフレームワークとして自動的に追加されます。
いくつかのセットアップの後、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、Combine用のリアクティブ拡張機能を提供します。
ReactiveSwift拡張機能はreactive.request(:callbackQueue:) reactive.requestWithProgress(:callbackQueue:)両方SignalProducer提供します。たとえば、エラーを処理するために、次のことを行うことができます。
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およびReactiveswiftのシグナル演算子のシリーズもあります。これはmapJSON()ネットワーク応答から受信したデータを画像、JSON、またはmapString() mapImage()のいずれかにマッピングしようとします。マッピングが失敗した場合、信号にエラーが発生します。また、特定のステータスコードをフィルタリングするための便利な方法も得られます。これは、無効な応答を処理するためのコードと同じ場所で、400年代のような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のコミュニティには途方もないポジティブなエネルギーがあり、メンテナーは物事を素晴らしいものに保つことに取り組んでいます。 Cocoapodsコミュニティのように、常に前向きな意図を想定しています。コメントが意地悪なように聞こえたとしても、その人に疑いの恩恵を与えてください。
このプロジェクトは、貢献者行動規範でリリースされていることに注意してください。このプロジェクトに参加することにより、その条件を順守することに同意します。
Moyaからソースファイルを追加または削除する場合、このリポジトリのルートにあるMoya.xcodeprojプロジェクトに対応する変更を行う必要があります。このプロジェクトはカルタゴに使用されます。心配しないでください。忘れた場合は、プルリクエストを送信するときに自動警告が表示されます。
あなたがコアメンバーであろうと、初めてそれを試しているユーザーであろうと、ドキュメントを改善することにより、Moyaに貴重な貢献をすることができます。私たちを助けてください:
MoyaはMITライセンスの下でリリースされます。詳細については、license.mdを参照してください。