Swift Academy · Pelajaran

Penerbit dan Pelanggan Tersuai

Bina komponen Combine anda sendiri.

Pelajaran 4 daripada 413 langkah

Penerbit dan Pelanggan Tersuai ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Swift Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Melangkaui Penerbit Terbina Dalam

Combine disertakan dengan banyak penerbit, tetapi kadangkala anda perlu membungkus API bukan Combine sebagai penerbit, atau menggunakan nilai dengan kawalan tekanan balik yang tepat. Ini bermakna anda perlu melaksanakan sendiri protokol Penerbit dan Pelanggan.

Protokol Penerbit

Penerbit mengisytiharkan jenis Output dan Failurenya serta melaksanakan receive(subscriber:), yang menyerahkan subscription kepada pelanggan yang menyambung.

protocol Publisher {
    associatedtype Output
    associatedtype Failure: Error
    func receive<S: Subscriber>(subscriber: S)
        where S.Input == Output, S.Failure == Failure
}

Peranan subscription

Apabila pelanggan menyambung, penerbit mencipta objek Subscription. Subscription ialah pautan yang mengurus permintaan dan menyampaikan nilai. Ia mematuhi Subscription, yang memanjangkan Cancellable.

Subscription Tersuai

Subscription menyimpan pelanggan dan bertindak balas terhadap permintaan dengan memancarkan nilai.

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
    }
}

Penerbit Tersuai

Penerbit hanya mencipta subscription dan menyerahkannya kepada pelanggan melalui 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)
    }
}

Memahami Permintaan

Tekanan balik ialah kawalan aliran Combine. Pelanggan meminta jumlah Demand tertentu, dan penerbit tidak boleh menghantar lebih banyak nilai daripada yang diminta. Mengembalikan permintaan daripada receive(_:) meningkatkan kuota.

Protokol Pelanggan

Pelanggan tersuai melaksanakan tiga kaedah: menerima subscription, kemudian setiap nilai, dan akhirnya penamatan.

protocol Subscriber {
    associatedtype Input
    associatedtype Failure: Error
    func receive(subscription: Subscription)
    func receive(_ input: Input) -> Subscribers.Demand
    func receive(completion: Subscribers.Completion<Failure>)
}

Pelanggan Tersuai

Di sini, pelanggan meminta dua nilai terlebih dahulu, kemudian satu lagi untuk setiap nilai yang diterimanya, sambil mencetak nilai tersebut.

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")
    }
}

Membungkus Antara Muka Perwakilan

Salah satu kegunaan praktikal penerbit tersuai ialah menjambatani antara muka perwakilan atau panggilan balik ke dalam Combine, supaya kod lama boleh digubah. Anda menyimpan pelanggan dan meneruskan panggilan balik perwakilan sebagai panggilan receive(_:).

Utamakan subject Jika Boleh

Melaksanakan protokol secara manual jarang diperlukan. Untuk kebanyakan kerja penyambungan, PassthroughSubject atau CurrentValueSubject jauh lebih mudah — anda hanya perlu memanggil send(_:).

let subject = PassthroughSubject<Int, Never>()

subject
    .sink { print($0) }
    .store(in: &cancellables)

subject.send(1)
subject.send(2)

Bila Perlu Menggunakan Pelaksanaan Tersuai

Gunakan pelaksanaan Penerbit/Pelanggan tersuai apabila anda memerlukan:

  • Kawalan tekanan balik yang terperinci
  • Pembungkusan sumber bukan Combine yang kompleks dengan cekap
  • Operator yang boleh diguna semula dan selamat dari segi jenis

Jika tidak, subjek dan operator terbina dalam ialah alat yang sesuai.

Semak Pantas

Uji pengetahuan anda tentang penerbit tersuai.

Imbas Kembali

Anda telah mempelajari cara melaksanakan protokol teras Combine:

  • Penerbit mencipta Subscription untuk setiap pelanggan
  • Subscription menghormati Permintaan (tekanan balik)
  • Pelanggan menerima subscription, nilai dan penamatan
  • Utamakan subjek untuk kebanyakan keperluan penyambungan

Memahami bahagian dalaman ini menjelaskan cara semua Combine berfungsi.

Percuma untuk bermula

Pelajari Swift dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
122
Pelajaran
409

Soalan Lazim

Adakah pelajaran “Penerbit dan Pelanggan Tersuai” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Penerbit dan Pelanggan Tersuai”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Penerbit dan Pelanggan Tersuai”?

Bina komponen Combine anda sendiri. Anda berlatih Swift Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Swift Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Swift Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Penerbit dan Pelanggan Tersuai” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengubah dan Menggabungkan Strim
  2. Penjadual dan Pengurutan Benang
  3. Operator Pengendalian Ralat
  4. Penerbit dan Pelanggan Tersuai
← Kembali ke Swift Academy