
이 문서의 중국어 버전은 여기에서 찾을 수 있습니다.
당신은 똑똑한 개발자입니다. 아마도 Alamofire를 사용하여 URLSession 에 대한 액세스를 추상화하고 실제로 신경 쓰지 않는 모든 불쾌한 세부 사항. 그러나 많은 스마트 개발자들과 마찬가지로 임시 네트워크 추상화 계층을 작성합니다. 그들은 아마도 "apimanager"또는 "networkmodel"이라고 불리며 항상 눈물로 끝납니다.

임시 네트워크 계층은 iOS 앱에서 일반적입니다. 몇 가지 이유로 나쁘다 :
따라서 Moya의 기본 아이디어는 실제로 Alamofire를 직접 호출하는 데 충분히 캡슐을 캡슐화하는 네트워크 추상화 계층을 원한다는 것입니다. 일반적인 것들이 쉽지만 복잡한 것들도 쉽게 포괄적 일 수있을 정도로 간단해야합니다.
Alamofire를 사용하여
URLSession추상화하는 경우 URL, 매개 변수 등의 끔찍한 끔찍한 것을 추상화하기 위해 무언가를 사용하지 않겠습니까?
Moya의 멋진 특징 :
비전 문서에서 프로젝트 방향에 대한 자세한 내용을 확인할 수 있습니다.
우리는 저장소에 두 가지 샘플 프로젝트를 제공했습니다. 이를 사용하려면 Repo를 다운로드하려면 carthage update 실행하여 필요한 라이브러리를 다운로드하고 Moya.xcodeproj를 엽니 다. Basic 및 Multi-Target - 하나를 선택한 다음 Build & Run! 이들에 대한 소스 파일은 Project Navigator의 Examples 디렉토리에 있습니다. 재미있게 보내세요!
이 프로젝트는 적극적으로 개발 중이며 Artsy의 경매 앱에서 사용되고 있습니다. 우리는 그것을 생산 사용 준비가된다고 생각합니다.
아래는 Swift 버전에 사용해야하는 Moya 버전을 보여주는 테이블입니다.
| 스위프트 | 모야 | rxmoya | Reactivemoya | rxswift | 반응식 WIFT | 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을 사용하더라도 올바르게 작동해야합니다.
Moya의 새로운 주요 버전으로 업그레이드 하시겠습니까? 마이그레이션 가이드를 확인하십시오.
참고 : 아래 지침은 Xcode UI없이 SwiftPM을 사용하는 것입니다. 프로젝트 설정 -> 신속한 패키지로 이동하여 Moya를 추가하는 것이 가장 쉬운 일입니다.
Xcode 통합없이 Apple의 Swift 패키지 관리자를 사용하여 통합하려면 다음을 Package.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 " ] )
]
)콤바인 메모아를 사용하는 경우 Xcode 11.5.0 이상을 사용하는지 확인하십시오. 이전 버전의 Xcode를 사용하면 Application Target에 약하게 연결된 프레임 워크로 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는 특정 저장소 서브 모듈 만 구축하는 방법을 제공하지 않습니다. 모든 서브 모듈 및 그 종속성은 위 명령으로 구축됩니다. 그러나 사용하지 않는 프레임 워크를 프로젝트에 복사 할 필요는 없습니다. 예를 들어,
ReactiveSwift사용하지 않는 경우carthage update완료된 후 Carthage 빌드 디렉토리에서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 프로젝트의 프로젝트 네비게이터로 드래그하십시오. Moya 폴더의 Moya.xcodeproj 와 동일하게 수행하십시오.응용 프로그램의 파란색 프로젝트 아이콘 아래에 중첩되어 있어야합니다. 다른 모든 Xcode 그룹 위에 있든 이하이든 상관 없습니다.
xcodeproj 의 배포 대상이 Project Navigator의 애플리케이션 대상 대상과 일치하는지 확인하십시오.+ 버튼을 클릭하십시오.Products 폴더 내부에 중첩 된 두 가지 버전의 Alamofire.framework 가있는 두 개의 다른 Alamofire.xcodeproj 폴더가 표시됩니다.어떤
Products폴더 중에서 선택하는지는 중요하지 않지만Alamofire.framework상단 또는 하단을 선택하든 상관 없습니다.
Alamofire.framework 및 MacOS의 하단을 선택하십시오.프로젝트의 빌드 로그를 검사하여 선택한 것을 확인할 수 있습니다.
Alamofire의 빌드 대상은Alamofire iOS,Alamofire macOS,Alamofire tvOS또는Alamofire watchOS로 표시됩니다.
"Embedded Binaries"아래에서 + 버튼을 다시 클릭하고 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 및 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에 대한 일련의 신호 연산자가 있으며 네트워크 응답에서받은 데이터를 이미지, 일부 JSON 또는 문자열, mapImage() , mapJSON() 및 mapString() 으로 각각 맵핑하려고 시도합니다. 매핑이 실패하면 신호에 오류가 발생합니다. 또한 특정 상태 코드를 필터링하기위한 편리한 방법을 얻을 수 있습니다. 즉, 400과 같은 API 오류를 처리하기위한 코드를 유효하지 않은 응답을 처리하기위한 코드와 같은 위치에 코드를 배치 할 수 있습니다.
Combine Extension 제공 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는 다음 중 하나에 도움을 줄 수 있습니다.
그 중 하나가 당신에게 멋지게 들리면, 풀 요청을 보내십시오! 첫 번째 기부 후, 우리는 당신이 풀려도 요청을 병합하고 선박을 조종하는 데 도움을 줄 수 있도록 Repo의 회원으로 당신을 추가 할 것입니다. 기고자 가이드 라인에서 이에 대한 자세한 내용을 읽을 수 있습니다.
Moya의 커뮤니티는 엄청난 긍정적 인 에너지를 가지고 있으며 관리자는 물건을 굉장하게 유지하기 위해 최선을 다하고 있습니다. Cocoapods 커뮤니티와 마찬가지로 항상 긍정적 인 의도를 가정하십시오. 의견이 의미가있는 것처럼 들리더라도 사람에게 의심의 이익을주십시오.
이 프로젝트는 기고자 행동 강령으로 공개됩니다. 이 프로젝트에 참여함으로써 귀하는 그 용어를 준수하는 데 동의합니다.
Moya에서 소스 파일을 추가하거나 제거하면이 저장소의 루트에있는 Moya.xcodeproj 프로젝트에 해당하는 변경이 필요합니다. 이 프로젝트는 카르타고에 사용됩니다. 걱정하지 마십시오. 잊어 버린 경우 풀 요청을 제출할 때 자동 경고를받을 수 있습니다.
핵심 회원이든 사용자가 처음으로 시도하든 문서를 개선하여 Moya에 귀중한 기여를 할 수 있습니다. 우리를 도와주세요 :
Moya는 MIT 라이센스에 따라 릴리스됩니다. 자세한 내용은 License.md를 참조하십시오.