
Eine chinesische Version dieses Dokuments finden Sie hier.
Du bist ein kluger Entwickler. Sie verwenden wahrscheinlich Alamofire, um den Zugang zu URLSession und all diese bösen Details, die Sie nicht wirklich interessieren, abstrahieren. Aber dann schreiben Sie wie viele intelligente Entwickler Ad -hoc -Netzwerkabstraktionsebenen. Sie werden wahrscheinlich "Apimanager" oder "NetworkModel" genannt und sie enden immer in Tränen.

Ad -hoc -Netzwerkschichten sind in iOS -Apps üblich. Sie sind aus ein paar Gründen schlecht:
Die Grundidee von Moya ist also, dass wir eine Netzwerkabstraktionsschicht haben möchten, die ausreichend zusammenfasst, die tatsächlich Alamofire direkt aufruft. Es sollte einfach genug sein, dass gemeinsame Dinge einfach sind, aber umfassend genug, dass auch komplizierte Dinge einfach sind.
Wenn Sie Alamofire verwenden, um
URLSessionabstrahieren zu können, verwenden Sie etwas, um die Niete von URLs, Parametern usw. abstrahieren?
Einige großartige Merkmale von Moya:
Sie können sich mehr über die Projektrichtung im Vision -Dokument überprüfen.
Wir haben zwei Beispielprojekte im Repository bereitgestellt. Um das Repo herunterzuladen, führen Sie carthage update aus, um die erforderlichen Bibliotheken herunterzuladen und Moya.xcodeProj zu öffnen. Sie werden zwei Schemata sehen: Basic und Multi-Target - wählen Sie eine aus und erstellen und rennen! Quelldateien für diese befinden sich im Examples im Project Navigator. Viel Spaß!
Dieses Projekt befindet sich aktiv in der Entwicklung und wird in der Auktions -App von Artsy verwendet. Wir betrachten es für die Produktionsnutzung.
Im Folgenden finden Sie eine Tabelle, in der angezeigt wird, welche Version von Moya Sie für Ihre Swift -Version verwenden sollten.
| Schnell | Moya | Rxmoya | Reactivemoya | Rxswift | Reaktivitätswift | 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 | - - | - - | - - |
Hinweis: Wenn Sie Swift 4.2 in Ihrem Projekt verwenden, aber Xcode 10.2 verwenden, sollte Moya 13 korrekt funktionieren, obwohl wir Swift 5.0 verwenden.
Upgrade auf eine neue Major -Version von Moya? Schauen Sie sich unsere Migrationsführer an.
HINWEIS: Anweisungen unten finden Sie für die Verwendung von SwiftPM ohne Xcode -Benutzeroberfläche. Es ist am einfachsten, zu Ihren Projekteinstellungen zu gehen -> Swift -Pakete und von dort aus Moya hinzufügen.
Um mit dem Swift -Paket -Manager von Apple ohne Xcode -Integration zu integrieren, fügen Sie Ihrem Package.swift Folgendes als Abhängigkeit hinzu.
. package ( url : " https://github.com/Moya/Moya.git " , . upToNextMajor ( from : " 15.0.0 " ) ) und geben Sie dann "Moya" als Abhängigkeit des Ziels an, in dem Sie Moya verwenden möchten. Wenn Sie reaktive Erweiterungen verwenden möchten, fügen Sie auch "ReactiveMoya" , "RxMoya" oder "CombineMoya" als Zielabhängigkeit hinzu. Hier ist ein 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 " ] )
]
)Kombinieren Sie Hinweis: Wenn Sie Combinemoya verwenden, stellen Sie sicher, dass Sie Xcode 11.5.0 oder höher verwenden. Mit früheren Versionen von Xcode müssen Sie Kombinat als schwach verknüpftes Framework zu Ihrem Anwendungsziel manuell hinzufügen.
ACCIO ist ein Abhängigkeitsmanager, der auf SWIFTPM basiert und Frameworks für iOS/macOS/tvos/watchos erstellen kann. Daher sind die Integrationsschritte von Moya genau die gleichen wie oben beschrieben. Sobald Ihr Package.swift -Datei konfiguriert ist, führen Sie accio update anstelle des swift package update aus.
Verwenden Sie für Moya den folgenden Eintrag in Ihrem Podfile:
pod 'Moya' , '~> 15.0'
# or
pod 'Moya/RxSwift' , '~> 15.0'
# or
pod 'Moya/ReactiveSwift' , '~> 15.0'
# or
pod 'Moya/Combine' , '~> 15.0' Führen Sie dann pod install aus.
Vergessen Sie nicht, das Framework mit import Moya zu importieren.
Karthago -Benutzer können auf dieses Repository hinweisen und das generierte Framework verwenden, das sie möchten, Moya , RxMoya , ReactiveMoya oder CombineMoya .
Machen Sie den folgenden Eintrag in Ihrem Cartfile:
github "Moya/Moya" ~> 15.0
Führen Sie dann carthage update --use-xcframeworks aus.
Wenn Sie Carthage im Projekt zum ersten Mal verwenden, müssen Sie einige zusätzliche Schritte durchlaufen, wie in Karthago erläutert.
Hinweis: Zu diesem Zeitpunkt bietet Carthage keine Möglichkeit, nur bestimmte Repository -Submodules zu erstellen. Alle Submodules und ihre Abhängigkeiten werden mit dem obigen Befehl erstellt. Sie müssen jedoch keine Frameworks kopieren, die Sie nicht in Ihr Projekt verwenden. Wenn Sie beispielsweise
ReactiveSwiftnicht verwenden, können Sie dieses Gerüst zusammen mitReactiveMoyaaus dem Carthage Build -Verzeichnis nach Abschlusscarthage updatelöschen. Oder wenn SieReactiveSwiftverwenden, jedoch nichtRxSwiftoderCombine, dann könnenRxMoya,RxTest,RxCocoa,CombineMoyausw. sicher gelöscht werden.
cd in Ihr Top-Level-Projektverzeichnis und führen Sie den folgenden Befehl aus , wenn Ihr Projekt nicht als Git-Repository initialisiert wird: $ git init$ git submodule add https://github.com/Alamofire/Alamofire.git
$ git submodule add https://github.com/Moya/Moya.gitAlamofire -Ordner und ziehen Sie die Alamofire.xcodeproj in den Projektnavigator des Xcode -Projekts Ihrer Anwendung. Machen Sie dasselbe mit dem Moya.xcodeproj im Moya -Ordner.Sie sollten unter dem Blue Project -Symbol Ihrer Anwendung verschachtelt erscheinen. Unabhängig davon, ob es über alle anderen Xcode -Gruppen liegt, spielt keine Rolle.
xcodeproj S dem Ihres Anwendungsziels im Projektnavigator übereinstimmen.+ unter dem Abschnitt "Embedded Binare".Alamofire.xcodeproj mit jeweils zwei verschiedenen Versionen des Alamofire.framework in einem Products verschachtelt.Es spielt keine Rolle, aus welchem
ProductsSie auswählen, aber es spielt wichtig, ob Sie das obere oder untereAlamofire.frameworkauswählen.
Alamofire.framework für iOS und die untere für macOS.Sie können überprüfen, welche Sie ausgewählt haben, indem Sie das Build -Protokoll für Ihr Projekt inspizieren. Das Build -Ziel für
Alamofirewird entweder alsAlamofire iOS,Alamofire macOS,Alamofire tvOSoderAlamofire watchOSaufgeführt.
Klicken Sie unter "Embedded Binaries" erneut auf die Schaltfläche + und fügen Sie das richtige Build -Ziel für Moya hinzu.
Und das war's!
Die drei Frameworks werden automatisch als Zielabhängigkeit, verknüpftes Framework und eingebettetes Framework in einer Kopierdateien -Build -Phase hinzugefügt, die alles ist, was Sie auf dem Simulator und einem Gerät erstellen müssen.
Nach einigem Setup ist die Verwendung von Moya wirklich einfach. Sie können auf eine API wie folgt zugreifen:
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.
}
}Das ist ein grundlegendes Beispiel. Viele API -Anfragen benötigen Parameter. Moya codiert diese in die Aufwand, die Sie verwenden, um auf den Endpunkt wie folgt zugreifen zu können:
provider = MoyaProvider < GitHub > ( )
provider . request ( . userProfile ( " ashfurrow " ) ) { result in
// do something with the result
}Keine Tippfehler mehr in URLs. Keine fehlenden Parameterwerte mehr. Kein Durcheinander mit Parametercodierung mehr.
Weitere Beispiele finden Sie in der Dokumentation.
Noch cooler sind die reaktiven Verlängerungen. Moya liefert reaktive Erweiterungen für Reaktivenwift, RXSwift und Kombinieren.
ReactiveSwift -Erweiterung bietet sowohl reactive.request(:callbackQueue:) callbackqueue :) SignalProducer auch reactive.requestWithProgress(:callbackQueue:) . Um beispielsweise Fehler umzugehen, könnten wir Folgendes tun:
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 -Erweiterung bietet auch sowohl rx.request(:callbackQueue:) als auch rx.requestWithProgress(:callbackQueue:) Methoden, aber der Rückgabetyp ist für beide unterschiedlich. Im Falle eines normalen rx.request(:callbackQueue) ist der Rückgabetyp Single<Response> , das entweder ein einzelnes Element oder einen Fehler ausgibt. Im Falle eines rx.requestWithProgress(:callbackQueue:) ist der Rückgabetyp Observable<ProgressResponse> , da wir möglicherweise mehrere Ereignisse aus dem Fortschritt und einem letzten Ereignis erhalten, das eine Antwort darstellt.
Um beispielsweise Fehler umzugehen, könnten wir Folgendes tun:
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 )
}
} Zusätzlich zu der Option, Signale anstelle von Rückrufblöcken zu verwenden, gibt es auch eine Reihe von Signaloperatoren für RXSwift und ReactiveSwift, die versuchen, die aus der Netzwerkantwort erhaltenen Daten in ein Bild, einen JSON oder eine String mit mapImage() , mapJSON() bzw. mapString() abzubilden. Wenn die Zuordnung nicht erfolgreich ist, erhalten Sie einen Fehler im Signal. Sie erhalten auch praktische Methoden, um bestimmte Statuscodes herauszufiltern. Dies bedeutet, dass Sie Ihren Code für den Umgang mit API -Fehlern wie 400 an denselben Stellen wie Code für die Behandlung ungültiger Antworten einrichten können.
Combine -Erweiterung bietet requestPublisher(:callbackQueue:) und requestWithProgressPublisher(:callbackQueue) AnyPublisher<Response, MoyaError> bzw. AnyPublisher<ProgressResponse, MoyaError> zurückgeben.
Hier ist ein Beispiel für die Nutzung 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 hat eine großartige Gemeinschaft und einige Leute haben einige sehr hilfreiche Erweiterungen geschaffen.
Hey! Magst du Moya? Eindrucksvoll! Wir könnten Ihre Hilfe tatsächlich wirklich nutzen!
Open Source schreibt nicht nur Code. Moya könnte Ihre Hilfe bei einer der folgenden Folgendes verwenden:
Wenn Sie für Sie cool klingt, senden Sie eine Pull -Anfrage! Nach Ihrem ersten Beitrag werden wir Sie als Mitglied zum Repo hinzufügen, damit Sie Pull -Anfragen zusammenführen und das Schiff steuern können? Weitere Informationen dazu finden Sie in unseren Beitragsrichtlinien.
Die Gemeinschaft von Moya hat eine enorme positive Energie, und die Betreuer sind verpflichtet, die Dinge großartig zu halten. Nehmen Sie wie in der Cocoapods -Community immer eine positive Absicht an. Auch wenn ein Kommentar gemein klingt, geben Sie der Person den Vorteil des Zweifels.
Bitte beachten Sie, dass dieses Projekt mit einem Verhaltenskodex von Mitwirkenden veröffentlicht wird. Wenn Sie an diesem Projekt teilnehmen, erklären Sie sich damit einverstanden, sich an seine Bedingungen einzuhalten.
Wenn Sie eine Quelldatei von Moya hinzufügen oder entfernen, muss an das Projekt dieses Repositorys eine entsprechende Änderung an das Projekt von Moya.xcodeproj vorgenommen werden. Dieses Projekt wird für Karthago verwendet. Machen Sie sich keine Sorgen, Sie erhalten eine automatisierte Warnung, wenn Sie eine Pull -Anfrage einreichen, wenn Sie vergessen.
Unabhängig davon, ob Sie ein Kernmitglied oder ein Benutzer zum ersten Mal ausprobieren, können Sie einen wertvollen Beitrag zu Moya leisten, indem Sie die Dokumentation verbessern. Hilf uns von:
Moya wird unter einer MIT -Lizenz freigelassen. Weitere Informationen finden Sie unter Lizenz.MD.