
Se puede encontrar una versión china de este documento aquí.
Eres un desarrollador inteligente. Probablemente use Alamofire para abstraer acceso a URLSession y todos esos detalles desagradables que realmente no le importan. Pero luego, como muchos desarrolladores inteligentes, escribe capas de abstracción de red ad hoc. Probablemente se llamen "apimanager" o "networkmodel", y siempre terminan llorando.

Las capas de red ad hoc son comunes en las aplicaciones de iOS. Son malos por algunas razones:
Entonces, la idea básica de Moya es que queremos una capa de abstracción de red que encapsule suficientemente que realmente llama a Alamofire directamente. Debe ser lo suficientemente simple que las cosas comunes sean fáciles, pero lo suficientemente integrales como para que las cosas complicadas también sean fáciles.
Si usa Alamofire para abstraer
URLSession, ¿por qué no usar algo para abstraer la arenga de las URL, los parámetros, etc.?
Algunas características increíbles de Moya:
Puede ver más sobre la dirección del proyecto en el documento de visión.
Hemos proporcionado dos proyectos de muestra en el repositorio. Para usarlo, descargue el repositorio, ejecute carthage update para descargar las bibliotecas requeridas y abra moya.xcodeproj. Verá dos esquemas: Basic y Multi-Target : ¡seleccione uno y luego Build & Run! Los archivos de origen para estos se encuentran en el directorio Examples en Project Navigator. ¡Divertirse!
Este proyecto está activamente en desarrollo y se está utilizando en la aplicación de subastas de Artsy. Lo consideramos listo para el uso de producción.
A continuación se muestra una tabla que muestra qué versión de Moya debe usar para su versión Swift.
| Rápido | Moya | Rxmoya | Reactivemoya | Rxswift | Reactivo | 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 | - | - | - |
Nota: Si está utilizando Swift 4.2 en su proyecto, pero está utilizando Xcode 10.2, Moya 13 debería funcionar correctamente a pesar de que usamos Swift 5.0.
¿Actualización a una nueva versión principal de Moya? Echa un vistazo a nuestras guías de migración.
Nota: Las instrucciones a continuación son para usar SWIFTPM sin la interfaz de usuario Xcode. Es el más fácil de ir a la configuración de su proyecto -> paquetes rápidos y agregar MOYA desde allí.
Para integrar el uso del Swift Package Manager de Apple, sin integración de Xcode, agregue lo siguiente como dependencia a su Package.swift :
. package ( url : " https://github.com/Moya/Moya.git " , . upToNextMajor ( from : " 15.0.0 " ) ) y luego especifique "Moya" como una dependencia del objetivo en el que desea usar MOYA. Si desea usar extensiones reactivas, agregue también "ReactiveMoya" , "RxMoya" o "CombineMoya" como su dependencia objetivo respectivamente. Aquí hay un ejemplo 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 " ] )
]
)Combine la nota: si está utilizando Combinemoya , asegúrese de usar Xcode 11.5.0 o posterior. Con versiones anteriores de Xcode, deberá agregar manualmente Combinar como un marco débilmente vinculado a su objetivo de aplicación.
ACCIO es un administrador de dependencia basado en SwiftPM que puede crear marcos para iOS/MacOS/TVOS/WatchOS. Por lo tanto, los pasos de integración de MOYA son exactamente los mismos que se describieron anteriormente. Una vez que se configure su archivo Package.swift , ejecute accio update en lugar de swift package update .
Para Moya, use la siguiente entrada en su Podfile:
pod 'Moya' , '~> 15.0'
# or
pod 'Moya/RxSwift' , '~> 15.0'
# or
pod 'Moya/ReactiveSwift' , '~> 15.0'
# or
pod 'Moya/Combine' , '~> 15.0' Luego ejecute pod install .
En cualquier archivo en el que desee usar MOYA, no olvide importar el marco con import Moya .
Los usuarios de Carthage pueden señalar este repositorio y usar el marco generado que deseen, Moya , RxMoya , ReactiveMoya o CombineMoya .
Haga la siguiente entrada en su archivo de carro:
github "Moya/Moya" ~> 15.0
Luego ejecute carthage update --use-xcframeworks .
Si esta es la primera vez que usa Cartago en el proyecto, deberá seguir algunos pasos adicionales como se explica en Cartago.
Nota: En este momento, Carthage no proporciona una forma de construir solo submódulos de repositorio específicos. Todos los submódulos y sus dependencias se construirán con el comando anterior. Sin embargo, no necesita copiar marcos que no esté utilizando en su proyecto. Por ejemplo, si no está utilizando
ReactiveSwift, no dude en eliminar ese marco junto conReactiveMoyadel directorio de compilación de Cartago después de que se completecarthage update. O si está utilizandoReactiveSwiftpero noRxSwiftoCombine, entoncesRxMoya,RxTest,RxCocoa,CombineMoya, etc., se puede eliminar de manera segura.
cd en su directorio de proyecto de nivel superior y ejecute el siguiente comando si su proyecto no se inicializa como un repositorio de Git: $ git init$ git submodule add https://github.com/Alamofire/Alamofire.git
$ git submodule add https://github.com/Moya/Moya.gitAlamofire y arrastre el Alamofire.xcodeproj en el navegador del proyecto del proyecto XCode de su aplicación. Haga lo mismo con el Moya.xcodeproj en la carpeta Moya .Deben aparecer anidados debajo del icono del proyecto azul de su aplicación. Si está por encima o por debajo de todos los demás grupos de Xcode no importa.
xcodeproj s coincidan con el de su objetivo de aplicación en el navegador del proyecto.+ en la sección "Binarios incrustados".Alamofire.xcodeproj cada una con dos versiones diferentes de Alamofire.framework anidada dentro de una carpeta Products .No importa qué carpeta
Productselija, pero sí importa si elige elAlamofire.frameworksuperior o inferior.
Alamofire.framework para iOS y el inferior para macOS.Puede verificar cuál seleccionó inspeccionando el registro de compilación para su proyecto. El objetivo de compilación para
Alamofirese enumerará comoAlamofire iOS,Alamofire macOS,Alamofire tvOSoAlamofire watchOS.
Haga clic en el botón + en "Binarios incrustados" nuevamente y agregue el objetivo de compilación correcto para Moya .
¡Y eso es todo!
Los tres marcos se agregan automáticamente como una dependencia de destino, marco vinculado y marco integrado en una fase de compilación de archivos de copia, que es todo lo que necesita para construir en el simulador y un dispositivo.
Después de una configuración, usar Moya es realmente simple. Puede acceder a una API como esta:
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.
}
}Ese es un ejemplo básico. Muchas solicitudes de API necesitan parámetros. Moya los codifica en el enum que usa para acceder al punto final, como este:
provider = MoyaProvider < GitHub > ( )
provider . request ( . userProfile ( " ashfurrow " ) ) { result in
// do something with the result
}No más errores tipográficos en URL. No más valores de parámetros faltantes. No más meter con la codificación de parámetros.
Para más ejemplos, consulte la documentación.
Incluso más frescos son las extensiones reactivas. Moya proporciona extensiones reactivas para ReactiviveWift, RxSwift y Combine.
ReactiveSwift Extension proporciona tanto reactive.request(:callbackQueue:) SignalProducer reactive.requestWithProgress(:callbackQueue:) Para manejar errores, por ejemplo, podríamos hacer lo siguiente:
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
}
} La extensión RxSwift también proporciona tanto rx.request(:callbackQueue:) y rx.requestWithProgress(:callbackQueue:) Métodos, pero el tipo de retorno es diferente para ambos. En el caso de un rx.request(:callbackQueue) , el tipo de retorno es Single<Response> que emite un solo elemento o un error. En el caso de un rx.requestWithProgress(:callbackQueue:) , el tipo de retorno es Observable<ProgressResponse> , ya que podemos obtener múltiples eventos de Progress y un último evento que es una respuesta.
Para manejar errores, por ejemplo, podríamos hacer lo siguiente:
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 )
}
} Además de la opción de usar señales en lugar de bloques de devolución de llamada, también hay una serie de operadores de señal para RXSWIFT y ReactiveWift que intentarán asignar los datos recibidos de la respuesta de la red en una imagen, algunos JSON o una cadena, con mapImage() , mapJSON() y mapString() , respectivamente. Si el mapeo no tiene éxito, recibirá un error en la señal. También obtiene métodos útiles para filtrar ciertos códigos de estado. Esto significa que puede colocar su código para manejar errores de API como 400 en los mismos lugares que el código para manejar respuestas no válidas.
Combine Extension proporciona requestPublisher(:callbackQueue:) y requestWithProgressPublisher(:callbackQueue) Devuelve AnyPublisher<Response, MoyaError> y AnyPublisher<ProgressResponse, MoyaError> respectivamente.
Aquí hay un ejemplo de uso de 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 tiene una gran comunidad a su alrededor y algunas personas han creado algunas extensiones muy útiles.
¡Ey! ¿Te gusta Moya? ¡Impresionante! ¡Realmente podríamos usar tu ayuda!
El código abierto no es solo escribir código. Moya podría usar su ayuda con cualquiera de los siguientes:
Si algo de eso le suena genial, ¡envíe una solicitud de extracción! Después de su primera contribución, lo agregaremos como miembro al repositorio para que pueda fusionar las solicitudes de extracción y ayudar a dirigir el barco. Puede leer más detalles sobre eso en nuestras pautas de contribuyentes.
La comunidad de Moya tiene una gran energía positiva, y los mantenedores están comprometidos a mantener las cosas increíbles. Como en la comunidad de Cocoapods, siempre asuma la intención positiva. Incluso si un comentario suena mezquino, dale a la persona el beneficio de la duda.
Tenga en cuenta que este proyecto se publica con un código de conducta de contribuyentes. Al participar en este proyecto, acepta cumplir con sus términos.
Si agrega o elimina un archivo de origen de MOYA, se debe hacer un cambio correspondiente al proyecto Moya.xcodeproj en la raíz de este repositorio. Este proyecto se utiliza para Cartago. No se preocupe, obtendrá una advertencia automatizada al enviar una solicitud de extracción si se olvida.
Ya sea que sea un miembro central o un usuario que lo pruebe por primera vez, puede hacer una valiosa contribución a Moya mejorando la documentación. Ayúdanos por:
Moya es liberado bajo una licencia del MIT. Vea la licencia.md para obtener más información.