0Pricing
Swift Academy · บทเรียน

ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง

สร้างองค์ประกอบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแปลงและรวมสตรีม
  2. ตัวจัดตารางเวลาและการทำงานของเธรด
  3. ตัวดำเนินการจัดการข้อผิดพลาด
  4. ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง
← กลับไปที่ Swift Academy