
เอกสารฉบับนี้สามารถพบได้ที่นี่
คุณเป็นนักพัฒนาที่ฉลาด คุณอาจใช้ Alamofire เพื่อเข้าถึง URLSession และรายละเอียดที่น่ารังเกียจทั้งหมดที่คุณไม่สนใจ แต่เช่นเดียวกับนักพัฒนาอัจฉริยะจำนวนมากคุณเขียนเลเยอร์นามธรรมเครือข่ายเฉพาะกิจ พวกเขาอาจเรียกว่า "Apimanager" หรือ "NetworkModel" และพวกเขามักจะจบลงด้วยน้ำตา

เลเยอร์เครือข่าย Ad Hoc เป็นเรื่องธรรมดาในแอพ iOS พวกเขาไม่ดีด้วยเหตุผลบางประการ:
ดังนั้นแนวคิดพื้นฐานของ Moya คือเราต้องการเลเยอร์นามธรรมเครือข่ายบางอย่างที่ห่อหุ้มอย่างเพียงพอจริง ๆ เรียก Alamofire โดยตรง มันควรจะง่ายพอที่สิ่งทั่วไปจะง่าย แต่ครอบคลุมพอที่สิ่งที่ซับซ้อนก็ง่ายเช่นกัน
หากคุณใช้ alamofire เพื่อเป็นนามธรรม
URLSessionออกไปทำไมไม่ใช้บางสิ่งบางอย่างเพื่อนามธรรมออกไปที่ url, พารามิเตอร์, ฯลฯ ?
คุณสมบัติที่ยอดเยี่ยมของ Moya:
คุณสามารถตรวจสอบเพิ่มเติมเกี่ยวกับทิศทางโครงการในเอกสารวิสัยทัศน์
เราได้จัดทำโครงการตัวอย่างสองโครงการในที่เก็บ หากต้องการใช้มันดาวน์โหลด repo ให้เรียกใช้ carthage update เพื่อดาวน์โหลดไลบรารีที่ต้องการและเปิด moya.xcodeproj คุณจะเห็นสองแผน: Basic และ Multi-Target - เลือกหนึ่งแล้วสร้างและเรียกใช้! ไฟล์ต้นฉบับสำหรับสิ่งเหล่านี้อยู่ในไดเรกทอรี Examples ใน Project Navigator มีความสุข!
โครงการนี้อยู่ระหว่างการพัฒนาอย่างแข็งขันและกำลังใช้ในแอพประมูลของ Artsy เราคิดว่ามันพร้อมสำหรับการใช้งานการผลิต
ด้านล่างเป็นตารางที่แสดงให้เห็นว่า Moya เวอร์ชันใดที่คุณควรใช้สำหรับเวอร์ชัน Swift ของคุณ
| ฉับพลัน | Moya | Rxmoya | ปฏิกิริยาตอบโต้ | rxswift | คำตอบ | อลาเมอฟี |
|---|---|---|---|---|---|---|
| > = 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 เวอร์ชันสำคัญใหม่หรือไม่? ตรวจสอบคู่มือการย้ายถิ่นของเรา
หมายเหตุ: คำแนะนำด้านล่างนี้ใช้สำหรับการใช้ SwiftPM โดยไม่ต้องใช้ XCode UI เป็นวิธีที่ง่ายที่สุดในการตั้งค่าโครงการของคุณ -> แพ็คเกจ Swift และเพิ่ม Moya จากที่นั่น
หากต้องการรวมโดยใช้ Swift Package Manager ของ Apple โดยไม่ต้องรวม Xcode ให้เพิ่มสิ่งต่อไปนี้เป็นการพึ่งพา 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 " ] )
]
)รวมหมายเหตุ: หากคุณใช้ 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 In อย่าลืมนำเข้ากรอบกับ import Moya
ผู้ใช้ Carthage สามารถชี้ไปที่ที่เก็บนี้และใช้กรอบที่สร้างขึ้นได้ไม่ว่าพวกเขาจะชอบ, Moya , RxMoya , ReactiveMoya หรือ CombineMoya
ทำรายการต่อไปนี้ใน CartFile ของคุณ:
github "Moya/Moya" ~> 15.0
จากนั้นเรียกใช้ carthage update --use-xcframeworks
หากนี่เป็นครั้งแรกที่คุณใช้คาร์เธจในโครงการคุณจะต้องทำตามขั้นตอนเพิ่มเติมตามที่อธิบายไว้ที่คาร์เธจ
หมายเหตุ: ในเวลานี้คาร์เธจไม่ได้ให้วิธีการสร้าง submodules ที่เก็บเฉพาะเฉพาะ submodules ทั้งหมดและการพึ่งพาของพวกเขาจะถูกสร้างขึ้นด้วยคำสั่งข้างต้น อย่างไรก็ตามคุณไม่จำเป็นต้องคัดลอกเฟรมเวิร์กที่คุณไม่ได้ใช้ในโครงการของคุณ ตัวอย่างเช่นหากคุณไม่ได้ใช้
ReactiveSwiftอย่าลังเลที่จะลบเฟรมเวิร์กนั้นพร้อมกับReactiveMoyaจากไดเรกทอรี Carthage Build หลังจากcarthage updateเสร็จสมบูรณ์ หรือถ้าคุณใช้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 ลงในโครงการ Navigator ของโครงการ XCode ของแอปพลิเคชันของคุณ ทำเช่นเดียวกันกับ Moya.xcodeproj ในโฟลเดอร์ Moyaพวกเขาควรปรากฏซ้อนอยู่ใต้ไอคอนโครงการสีน้ำเงินของแอปพลิเคชันของคุณ ไม่ว่าจะอยู่ด้านบนหรือต่ำกว่ากลุ่ม Xcode อื่น ๆ ทั้งหมดไม่สำคัญ
xcodeproj s ของเป้าหมายแอปพลิเคชันของคุณใน Project Navigator+ ภายใต้ส่วน "Binaries ฝังตัว"Alamofire.xcodeproj ที่แตกต่างกันสองโฟลเดอร์แต่ละรายการมีสองรุ่นที่แตกต่างกันของ Alamofire.framework ซ้อนกันภายในโฟลเดอร์ Productsไม่สำคัญว่าโฟลเดอร์
Productsใดที่คุณเลือก แต่ไม่ว่าคุณจะเลือกAlamofire.frameworkด้านบนหรือล่าง
Alamofire.framework ด้านบนสำหรับ iOS และด้านล่างสำหรับ 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 เข้ารหัสสิ่งเหล่านี้เป็น enum ที่คุณใช้เพื่อเข้าถึงจุดสิ้นสุดเช่นนี้:
provider = MoyaProvider < GitHub > ( )
provider . request ( . userProfile ( " ashfurrow " ) ) { result in
// do something with the result
}ไม่มีการพิมพ์ผิดใน URL อีกต่อไป ไม่มีค่าพารามิเตอร์ที่หายไปอีก ไม่ยุ่งกับการเข้ารหัสพารามิเตอร์อีกต่อไป
สำหรับตัวอย่างเพิ่มเติมดูเอกสารประกอบ
แม้แต่ตัวทำความเย็นก็คือส่วนขยายที่มีปฏิกิริยา Moya ให้ส่วนขยายปฏิกิริยาสำหรับ ReactiveSwift, RXSWIFT และรวมกัน
Extension 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() ตามลำดับ หากการแมปไม่ประสบความสำเร็จคุณจะได้รับข้อผิดพลาดกับสัญญาณ คุณยังได้รับวิธีการที่มีประโยชน์สำหรับการกรองรหัสสถานะบางอย่าง ซึ่งหมายความว่าคุณสามารถวางรหัสของคุณสำหรับการจัดการข้อผิดพลาด API เช่น 400 ในสถานที่เดียวกันกับรหัสสำหรับการจัดการการตอบกลับที่ไม่ถูกต้อง
การ 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 สามารถใช้ความช่วยเหลือของคุณด้วยสิ่งต่อไปนี้:
หากสิ่งใดที่ฟังดูเจ๋งสำหรับคุณส่งคำขอดึง! หลังจากการบริจาคครั้งแรกของคุณเราจะเพิ่มคุณเป็นสมาชิกใน Repo เพื่อให้คุณสามารถรวมคำขอดึงและช่วยคัดท้ายเรือได้หรือไม่? คุณสามารถอ่านรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนั้นในแนวทางของผู้สนับสนุนของเรา
ชุมชนของ Moya มีพลังงานในเชิงบวกอย่างมากและผู้ดูแลมีความมุ่งมั่นที่จะรักษาสิ่งต่าง ๆ ที่ยอดเยี่ยม เช่นเดียวกับในชุมชน Cocoapods มักจะถือว่ามีเจตนาเชิงบวกเสมอ แม้ว่าความคิดเห็นจะฟังดูมีชีวิตชีวา แต่ก็ให้ประโยชน์แก่ผู้ที่มีข้อสงสัย
โปรดทราบว่าโครงการนี้ได้รับการปล่อยตัวพร้อมกับจรรยาบรรณของผู้สนับสนุน โดยการเข้าร่วมในโครงการนี้คุณตกลงที่จะปฏิบัติตามข้อกำหนดของมัน
หากคุณเพิ่มหรือลบไฟล์ต้นฉบับออกจาก Moya จะต้องมีการเปลี่ยนแปลงที่สอดคล้องกันในโครงการ Moya.xcodeproj ที่รูทของที่เก็บนี้ โครงการนี้ใช้สำหรับคาร์เธจ ไม่ต้องกังวลคุณจะได้รับคำเตือนอัตโนมัติเมื่อส่งคำขอดึงหากคุณลืม
ไม่ว่าคุณจะเป็นสมาชิกหลักหรือผู้ใช้ลองใช้เป็นครั้งแรกคุณสามารถบริจาคเงินให้กับ Moya ได้โดยปรับปรุงเอกสาร ช่วยเราโดย:
Moya ได้รับการปล่อยตัวภายใต้ใบอนุญาต MIT ดู License.MD สำหรับข้อมูลเพิ่มเติม