Penjadwal dan Threading
Kendalikan eksekusi dengan receive(on:) dan subscribe(on:).
Penjadwal dan Threading adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.
Penjadwal dalam Combine
Penjadwal dalam Combine menentukan kapan dan di mana pekerjaan berjalan—utas atau antrean mana yang menjalankan operator dan mengirimkan nilai kepada pelanggan.
Mengendalikan penjadwal sangat penting untuk menjaga pembaruan antarmuka pengguna tetap berjalan di utas utama dan pekerjaan berat berjalan di luarnya.
Dua Operator Utama
Combine menyediakan dua operator untuk mengendalikan penggunaan utas:
- subscribe(on:)—mengendalikan tempat langganan dan pekerjaan di hulu dimulai
- receive(on:)—mengendalikan tempat nilai di hilir dikirimkan
Keduanya memengaruhi ujung yang berbeda dari alur pemrosesan.
receive(on:)
receive(on:) memindahkan semua hal setelah operator ini ke penjadwal yang diberikan. Penggunaan paling umumnya adalah kembali ke antrean utama sebelum memperbarui antarmuka pengguna.
apiClient.fetchUser(id: 1)
.receive(on: DispatchQueue.main)
.sink { user in
self.nameLabel.text = user.name
}
.store(in: &cancellables)subscribe(on:)
subscribe(on:) mengendalikan utas tempat publisher mulai menghasilkan nilai dan tempat operator di hulu berjalan. Gunakan operator ini untuk memindahkan penyiapan yang mahal dari utas utama.
heavyPublisher
.subscribe(on: DispatchQueue.global(qos: .userInitiated))
.receive(on: DispatchQueue.main)
.sink { result in
self.update(result)
}
.store(in: &cancellables)subscribe(on:) dibandingkan dengan receive(on:)
Ingat arahnya:
- subscribe(on:) memengaruhi hulu—tempat pekerjaan dimulai
- receive(on:) memengaruhi hilir—tempat hasil dikirimkan
Pola yang umum menggunakan subscribe(on:) untuk pekerjaan di background dan receive(on:) untuk pengiriman di utas utama.
DispatchQueue sebagai Penjadwal
DispatchQueue mematuhi protokol Scheduler. DispatchQueue.main mengirimkan hasil di utas utama; antrean global berjalan secara bersamaan di background.
let background = DispatchQueue.global(qos: .background)
publisher
.map { expensiveTransform($0) }
.subscribe(on: background)
.receive(on: DispatchQueue.main)
.sink { self.render($0) }
.store(in: &cancellables)RunLoop sebagai Penjadwal
RunLoop adalah penjadwal lain yang terikat pada run loop sebuah utas. RunLoop.main mengirimkan hasil selaras dengan peristiwa antarmuka pengguna, yang dapat berpengaruh pada hal-hal seperti responsivitas pengguliran.
timerPublisher
.receive(on: RunLoop.main)
.sink { _ in
self.tick()
}
.store(in: &cancellables)DispatchQueue dibandingkan dengan RunLoop
Keduanya dapat mengirimkan hasil di utas utama, tetapi memiliki perbedaan kecil:
- DispatchQueue.main—menjadwalkan pekerjaan bahkan selama pelacakan pengguliran
- RunLoop.main—menunda pekerjaan saat run loop berada dalam mode pelacakan
Untuk sebagian besar pembaruan antarmuka pengguna setelah pekerjaan asinkron, DispatchQueue.main adalah pilihan bawaan yang lebih aman.
Operator Pengaturan Waktu Penjadwal
Operator seperti debounce, pembatas laju, dan penundaan menerima argumen penjadwal yang menentukan antrean untuk menangani pengaturan waktunya.
searchTextPublisher
.debounce(for: .milliseconds(300), scheduler: DispatchQueue.main)
.sink { query in
self.runSearch(query)
}
.store(in: &cancellables)Kesalahan Umum pada Utas
Memperbarui antarmuka pengguna di luar utas utama dapat menyebabkan kerusakan atau gangguan tampilan. Jika Anda lupa receive(on: DispatchQueue.main) setelah publisher di background, sink Anda mungkin berjalan di utas background.
Selalu kirimkan nilai yang digunakan antarmuka pengguna melalui penjadwal utama.
Menyatukan Semuanya
Alur pemrosesan yang kuat memulai pekerjaan di background, memprosesnya di sana, lalu mengirimkannya ke utas utama untuk ditampilkan.
imageURLPublisher
.subscribe(on: DispatchQueue.global())
.flatMap { url in downloadImage(url) }
.map { resize($0) }
.receive(on: DispatchQueue.main)
.sink { self.imageView.image = $0 }
.store(in: &cancellables)Uji Singkat
Ujilah pengetahuan Anda tentang penjadwal.
Ringkasan
Anda telah mempelajari cara mengendalikan penggunaan utas dalam Combine:
- subscribe(on:)—tempat pekerjaan di hulu dimulai
- receive(on:)—tempat hasil dikirimkan
- DispatchQueue dan RunLoop sebagai penjadwal
- Selalu kirimkan pembaruan antarmuka pengguna di utas utama
Penjadwalan yang tepat menjaga aplikasi tetap responsif dan bebas dari kerusakan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penjadwal dan Threading” gratis?
Ya — teks lengkap “Penjadwal dan Threading” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Penjadwal dan Threading”?
Kendalikan eksekusi dengan receive(on:) dan subscribe(on:). Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Swift Academy?
Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Penjadwal dan Threading” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?
Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mentransformasi dan Menggabungkan Aliran
- Penjadwal dan Threading
- Operator Penanganan Kesalahan
- Publisher dan Subscriber Kustom