Kesan dan Kebergantungan
Kendalikan kesan sampingan dan suntik kebergantungan.
Kesan dan Kebergantungan ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 3 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.
Mengapa Kesan Sampingan Wujud
Reducer mesti kekal tulen: diberikan keadaan dan tindakan, Reducer hanya mengubah keadaan. Namun, aplikasi sebenar memerlukan kesan sampingan seperti permintaan rangkaian dan pemasa. TCA memodelkan perkara ini sebagai kesan sampingan yang dikembalikan oleh Reducer, supaya pengubahan kekal tulen manakala kerja tak segerak berjalan secara berasingan.
Pemisahan inilah yang menjadikan ciri boleh diuji.
import ComposableArchitecture
// Reducer stays pure; side effects are values it returns.
// Returning .none means no further work.Mengembalikan .none
Apabila sesuatu tindakan hanya mengubah keadaan dan tidak memerlukan kerja susulan, Reducer mengembalikan .none. Ini ialah kesan yang paling biasa dan menandakan bahawa tiada kerja tak segerak perlu dilakukan.
Anda telah melihatnya sebelum ini; inilah nilai asas yang digunakan oleh setiap cabang apabila tiada pilihan lain.
import ComposableArchitecture
Reduce { state, action in
switch action {
case .incrementTapped:
state.count += 1
return .none
}
}Effect.run untuk Kerja Tak Segerak
Untuk melakukan kerja tak segerak, Anda mengembalikan .run. Penutupannya menerima pemegang send yang digunakan untuk menghantar hasil kembali ke dalam sistem sebagai tindakan baharu.
Di sini, tindakan fetch memuatkan data dan menghantar tindakan respons apabila selesai.
import ComposableArchitecture
Reduce { state, action in
switch action {
case .reloadTapped:
return .run { send in
let value = try await loadNumber()
await send(.responseReceived(value))
}
case let .responseReceived(value):
state.count = value
return .none
}
}Menghantar Semula Hasil sebagai Action
Sesuatu kesan tidak boleh mengubah keadaan secara langsung; sebaliknya, kesan menghantar tindakan melalui send. Reducer kemudiannya mengendalikan tindakan tersebut dan mengemas kini keadaan. Gelung ini memastikan setiap pengubahan berlaku dalam Reducer.
Jadi, respons rangkaian menjadi tindakan respons yang disimpan oleh Reducer.
import ComposableArchitecture
.run { send in
let result = try await fetch()
await send(.dataLoaded(result))
}
// .dataLoaded is then handled by the reducer to set state.Mengendalikan Ralat dalam Kesan Sampingan
Kerja tak segerak boleh melemparkan ralat. Anda boleh menangkap ralat dalam kesan tersebut dan menghantar tindakan kegagalan, supaya Reducer beralih kepada keadaan ralat dengan kemas.
Penutupan catch pilihan pada .run menerima ralat yang dilemparkan.
import ComposableArchitecture
.run { send in
let value = try await loadNumber()
await send(.responseReceived(value))
} catch: { error, send in
await send(.loadFailed)
}Mengapa Kebergantungan Penting
Jika Reducer memanggil klien rangkaian atau membaca tarikh secara langsung, Reducer menjadi sukar diuji dan dikawal. TCA menyelesaikan masalah ini dengan kebergantungan: perkhidmatan yang boleh disuntik dan diakses oleh Reducer melalui @Dependency.
Dalam ujian, Anda menggantikannya dengan objek tiruan yang memberikan hasil boleh dijangka.
import ComposableArchitecture
// Instead of calling APIClient.shared directly,
// inject it as a dependency so tests can replace it.Pembungkus Sifat @Dependency
Dalam Reducer, Anda mengisytiharkan kebergantungan dengan @Dependency, lalu menamakannya menggunakan laluan kuncinya dalam nilai kebergantungan. Pustaka menyediakan kebergantungan terbina dalam seperti jam dan penjana UUID.
Di sini, Reducer mendapatkan jam berterusan.
import ComposableArchitecture
@Reducer
struct TimerFeature {
@ObservableState
struct State: Equatable { var seconds = 0 }
enum Action { case start, tick }
@Dependency(\.continuousClock) var clock
var body: some ReducerOf<Self> {
Reduce { state, action in .none }
}
}Menggunakan Kebergantungan dalam Kesan Sampingan
Selepas diisytiharkan, Anda menggunakan kebergantungan tersebut di dalam .run. Oleh sebab jam disuntik, ujian boleh membekalkan jam ujian yang memajukan masa apabila diminta.
Di sini, pemasa berdetik setiap saat menggunakan jam yang disuntik.
import ComposableArchitecture
var body: some ReducerOf<Self> {
Reduce { state, action in
switch action {
case .start:
return .run { send in
for await _ in self.clock.timer(interval: .seconds(1)) {
await send(.tick)
}
}
case .tick:
state.seconds += 1
return .none
}
}
}Menentukan Kebergantungan Sendiri
Anda mendaftarkan kebergantungan tersuai dengan mematuhi DependencyKey dan menyediakan liveValue. Kemudian, Anda menambah sifat terhitung pada DependencyValues supaya kebergantungan itu mendapat laluan kunci.
Di sini, klien API menjadi kebergantungan utama.
import ComposableArchitecture
struct NumberClient {
var fetch: () async throws -> Int
}
extension NumberClient: DependencyKey {
static let liveValue = NumberClient {
try await loadNumber()
}
}
extension DependencyValues {
var numberClient: NumberClient {
get { self[NumberClient.self] }
set { self[NumberClient.self] = newValue }
}
}Menyuntik Kebergantungan Tersuai
Dengan laluan kunci yang tersedia, Reducer mengisytiharkan klien menggunakan @Dependency(\.numberClient) dan memanggilnya di dalam kesan. Persekitaran produksi menggunakan nilai langsung; ujian mengatasinya.
Di sini, tindakan muat semula mendapatkan data melalui klien yang disuntik.
import ComposableArchitecture
@Reducer
struct NumberFeature {
@ObservableState
struct State: Equatable { var value = 0 }
enum Action { case reload, response(Int) }
@Dependency(\.numberClient) var numberClient
var body: some ReducerOf<Self> {
Reduce { state, action in
switch action {
case .reload:
return .run { send in
let n = try await numberClient.fetch()
await send(.response(n))
}
case let .response(n):
state.value = n
return .none
}
}
}
}Membatalkan Kesan
Kesan yang berjalan lama seperti pemasa sepatutnya boleh dibatalkan. Anda menandai kesan dengan pengecam cancellable dan membatalkannya kemudian daripada tindakan lain menggunakan .cancel.
Dalam contoh ini, pemasa boleh dihentikan apabila diperlukan.
import ComposableArchitecture
enum CancelID { case timer }
// Start a cancellable effect:
.run { send in /* ... */ }
.cancellable(id: CancelID.timer)
// Stop it from another action:
.cancel(id: CancelID.timer)Semakan Pantas: Kesan dan Hasil
Ingat kembali cara kesan menyampaikan hasilnya kepada pereduksi.
Imbas Kembali: Kesan dan Kebergantungan
Anda telah mempelajari cara TCA mengendalikan kesan sampingan dan penyuntikan:
- Pereduksi kekal tulen dan memulangkan nilai
Effect;.nonebermaksud tiada kerja. .runmelaksanakan kerja tak segerak dan menghantar hasil kembali melaluiawait send(.action).- Ralat dikendalikan dengan penutupan
catchkesan tersebut. @Dependencymenyuntik perkhidmatan seperti jam atau klien anda sendiri, yang diisytiharkan melaluiDependencyKeydanDependencyValues.- Kesan yang berjalan lama boleh dijadikan
cancellableberdasarkan ID.
Seterusnya, anda akan menggabungkan ciri dan mengujinya secara menyeluruh.
import ComposableArchitecture
// Recap: pure reducer + Effect.run for async work
// + @Dependency for testable, injectable services.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 “Kesan dan Kebergantungan” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Kesan dan Kebergantungan”, 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 “Kesan dan Kebergantungan”?
Kendalikan kesan sampingan dan suntik kebergantungan. 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 3 daripada 4.
Berapa lamakah pelajaran “Kesan dan Kebergantungan” 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
- Keadaan, Tindakan dan Reducer
- Store dan Integrasi SwiftUI
- Kesan dan Kebergantungan
- Menggubah dan Menguji Ciri