
该文档的中文版本可以在此处找到。
您是一个聪明的开发人员。您可能会使用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。