ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง
สร้างองค์ประกอบ Combine ของคุณเอง
ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
นอกเหนือจากผู้เผยแพร่ที่มีมาให้
คอมไบน์มาพร้อมผู้เผยแพร่จำนวนมาก แต่บางครั้งคุณจำเป็นต้องห่อหุ้มเอพีไอที่ไม่ใช่คอมไบน์ให้เป็นผู้เผยแพร่ หรือรับค่าด้วยการควบคุมแรงดันย้อนกลับอย่างแม่นยำ ซึ่งหมายความว่าคุณต้องลงมือใช้งานโปรโตคอลผู้เผยแพร่และผู้สมัครรับข้อมูลด้วยตนเอง
โปรโตคอลผู้เผยแพร่
ผู้เผยแพร่ จะประกาศชนิด Output และ Failure ของตนเอง และใช้งาน receive(subscriber:) ซึ่งเป็นจุดที่ส่งต่อการสมัครรับข้อมูลให้ผู้สมัครรับข้อมูลที่เข้ามา
protocol Publisher {
associatedtype Output
associatedtype Failure: Error
func receive<S: Subscriber>(subscriber: S)
where S.Input == Output, S.Failure == Failure
}บทบาทของการสมัครรับข้อมูล
เมื่อผู้สมัครรับข้อมูลเชื่อมต่อ ผู้เผยแพร่จะสร้างวัตถุ การสมัครรับข้อมูล ขึ้นมา การสมัครรับข้อมูลนี้เป็นตัวเชื่อมที่จัดการความต้องการและส่งค่าให้ผู้สมัครรับข้อมูล โดยสอดคล้องกับ Subscription ซึ่งต่อยอดมาจาก Cancellable
การสมัครรับข้อมูลแบบกำหนดเอง
การสมัครรับข้อมูลจะเก็บผู้สมัครรับข้อมูลไว้ และตอบสนองต่อคำขอความต้องการด้วยการส่งค่าออกมา
final class CountSubscription<S: Subscriber>: Subscription
where S.Input == Int {
private var subscriber: S?
private var current = 0
init(subscriber: S) {
self.subscriber = subscriber
}
func request(_ demand: Subscribers.Demand) {
var remaining = demand
while remaining > 0 {
remaining -= 1
remaining += subscriber?.receive(current) ?? .none
current += 1
}
}
func cancel() {
subscriber = nil
}
}ผู้เผยแพร่แบบกำหนดเอง
ผู้เผยแพร่เพียงสร้างการสมัครรับข้อมูล แล้วส่งต่อให้ผู้สมัครรับข้อมูลผ่าน receive(subscription:)
struct CountPublisher: Publisher {
typealias Output = Int
typealias Failure = Never
func receive<S: Subscriber>(subscriber: S)
where S.Input == Int, S.Failure == Never {
let subscription = CountSubscription(subscriber: subscriber)
subscriber.receive(subscription: subscription)
}
}ทำความเข้าใจความต้องการ
แรงดันย้อนกลับ คือกลไกควบคุมการไหลของข้อมูลในคอมไบน์ ผู้สมัครรับข้อมูลจะขอ Demand จำนวนหนึ่ง และผู้เผยแพร่ต้องไม่ส่งค่าเกินจำนวนที่ขอ การคืนค่าความต้องการจาก receive(_:) จะเพิ่มจำนวนที่อนุญาตให้ส่งได้
โปรโตคอลผู้สมัครรับข้อมูล
ผู้สมัครรับข้อมูลแบบกำหนดเองต้องใช้งานเมธอดสามรายการ ได้แก่ รับการสมัครรับข้อมูล จากนั้นรับค่าแต่ละค่า และสุดท้ายรับการแจ้งการเสร็จสิ้น
protocol Subscriber {
associatedtype Input
associatedtype Failure: Error
func receive(subscription: Subscription)
func receive(_ input: Input) -> Subscribers.Demand
func receive(completion: Subscribers.Completion<Failure>)
}ผู้สมัครรับข้อมูลแบบกำหนดเอง
ในตัวอย่างนี้ ผู้สมัครรับข้อมูลจะขอค่าล่วงหน้าสองค่า จากนั้นขอเพิ่มอีกหนึ่งค่าสำหรับทุกค่าที่ได้รับ พร้อมพิมพ์ผลไปด้วย
final class PrintSubscriber: Subscriber {
typealias Input = Int
typealias Failure = Never
func receive(subscription: Subscription) {
subscription.request(.max(2))
}
func receive(_ input: Int) -> Subscribers.Demand {
print("Value:", input)
return .max(1)
}
func receive(completion: Subscribers.Completion<Never>) {
print("Done")
}
}การห่อหุ้มเอพีไอแบบผู้รับมอบหมาย
การใช้งานจริงอย่างหนึ่งของผู้เผยแพร่แบบกำหนดเองคือการเชื่อมเอพีไอแบบผู้รับมอบหมายหรือแบบเรียกกลับเข้ากับคอมไบน์ ทำให้โค้ดเดิมสามารถนำมาประกอบใช้งานร่วมกันได้ คุณจะเก็บผู้สมัครรับข้อมูลไว้ แล้วส่งต่อการเรียกกลับจากผู้รับมอบหมายเป็นการเรียก receive(_:)
ควรใช้ subject เมื่อทำได้
โดยทั่วไปไม่จำเป็นต้องใช้งานโปรโตคอลเหล่านี้ด้วยตนเอง สำหรับการเชื่อมต่อส่วนใหญ่ การใช้ PassthroughSubject หรือ CurrentValueSubject จะง่ายกว่ามาก เพียงเรียก send(_:) เท่านั้น
let subject = PassthroughSubject<Int, Never>()
subject
.sink { print($0) }
.store(in: &cancellables)
subject.send(1)
subject.send(2)เมื่อใดควรใช้งานแบบกำหนดเอง
เลือกใช้งานผู้เผยแพร่หรือผู้สมัครรับข้อมูลแบบกำหนดเองเมื่อคุณต้องการ:
- ควบคุม แรงดันย้อนกลับ อย่างละเอียด
- ห่อหุ้มแหล่งข้อมูลที่ไม่ใช่คอมไบน์และมีความซับซ้อนอย่างมีประสิทธิภาพ
- ตัวดำเนินการที่นำกลับมาใช้ซ้ำได้และปลอดภัยด้านชนิดข้อมูล
มิฉะนั้น ซับเจกต์และตัวดำเนินการที่มีมาให้คือเครื่องมือที่เหมาะสม
ตรวจสอบความเข้าใจ
ทดสอบความรู้เกี่ยวกับผู้เผยแพร่แบบกำหนดเองของคุณ
สรุปทบทวน
คุณได้เรียนรู้วิธีใช้งานโปรโตคอลหลักของคอมไบน์:
- ผู้เผยแพร่ จะสร้าง การสมัครรับข้อมูล สำหรับผู้สมัครรับข้อมูลแต่ละราย
- การสมัครรับข้อมูลจะเคารพ ความต้องการ หรือแรงดันย้อนกลับ
- ผู้สมัครรับข้อมูล จะรับการสมัครรับข้อมูล ค่า และการแจ้งการเสร็จสิ้น
- ควรใช้ ซับเจกต์ สำหรับความต้องการด้านการเชื่อมต่อส่วนใหญ่
การทำความเข้าใจกลไกภายในเหล่านี้ช่วยให้เห็นภาพการทำงานทั้งหมดของคอมไบน์ได้ชัดเจนขึ้น
คำถามที่พบบ่อย
บทเรียน “ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง”
สร้างองค์ประกอบ Combine ของคุณเอง คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแปลงและรวมสตรีม
- ตัวจัดตารางเวลาและการทำงานของเธรด
- ตัวดำเนินการจัดการข้อผิดพลาด
- ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง