0Pricing
Swift Academy · Ders

Efektler ve Bağımlılıklar

Yan etkileri yönetin ve bağımlılıkları enjekte edin.

Efektler ve Bağımlılıklar, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.

Etkiler Neden Var

İndirgeyiciler saf kalmalıdır: bir durum ve eylem verildiğinde yalnızca durumu değiştirirler. Ancak gerçek uygulamaların ağ istekleri ve zamanlayıcılar gibi yan etkilere ihtiyacı vardır. TCA bunları indirgeyicinin döndürdüğü etkiler olarak modeller; böylece değişiklikler saf kalırken asenkron iş ayrı olarak çalışır.

Bu ayrım, özelliklerin test edilebilir olmasını sağlar.

import ComposableArchitecture

// Reducer stays pure; side effects are values it returns.
// Returning .none means no further work.

.none Döndürme

Bir eylem yalnızca durumu değiştiriyor ve devamında yapılacak bir işe ihtiyaç duymuyorsa, indirgeyici .none döndürür. Bu, en yaygın etkidir ve yapılacak asenkron bir iş olmadığını belirtir.

Bunu daha önce gördünüz; her dalın başvurduğu temel seçenektir.

import ComposableArchitecture

Reduce { state, action in
    switch action {
    case .incrementTapped:
        state.count += 1
        return .none
    }
}

Asenkron İşler için Effect.run

Asenkron iş gerçekleştirmek için .run döndürürsünüz. Bu kapanış, sonuçları yeni eylemler olarak sisteme geri iletmek için kullandığınız bir send tutamacı alır.

Burada bir getirme eylemi verileri yükler ve işlem tamamlandığında bir yanıt eylemi gönderir.

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

Sonuçları Eylem Olarak Geri İletme

Bir etki durumu doğrudan değiştiremez; bunun yerine send aracılığıyla eylemler gönderir. İndirgeyici daha sonra bu eylemleri ele alır ve durumu günceller. Bu döngü, tüm değişiklikleri indirgeyicinin içinde tutar.

Dolayısıyla bir ağ yanıtı, indirgeyicinin sakladığı bir yanıt eylemine dönüşür.

import ComposableArchitecture

.run { send in
    let result = try await fetch()
    await send(.dataLoaded(result))
}
// .dataLoaded is then handled by the reducer to set state.

Etkilerde Hataları Ele Alma

Asenkron işler hata oluşturabilir. Hataları etkinin içinde yakalayıp bir başarısızlık eylemi gönderebilir ve indirgeyicinin temiz bir şekilde hata durumuna geçmesini sağlayabilirsiniz.

.run üzerindeki isteğe bağlı catch kapanışı, oluşturulan hatayı alır.

import ComposableArchitecture

.run { send in
    let value = try await loadNumber()
    await send(.responseReceived(value))
} catch: { error, send in
    await send(.loadFailed)
}

Bağımlılıklar Neden Önemlidir

Bir indirgeyici doğrudan bir ağ istemcisini çağırır veya tarihi doğrudan okursa, test edilmesi ve denetlenmesi zorlaşır. TCA bunu bağımlılıklarla çözer: indirgeyicinizin @Dependency aracılığıyla eriştiği enjekte edilebilir hizmetlerle.

Testlerde bunları öngörülebilir sahte uygulamalarla değiştirirsiniz.

import ComposableArchitecture

// Instead of calling APIClient.shared directly,
// inject it as a dependency so tests can replace it.

@Dependency Özellik Sarmalayıcısı

Bir indirgeyicinin içinde, bağımlılığı @Dependency ile tanımlar ve onu bağımlılık değerlerindeki anahtar yoluyla adlandırırsınız. Kitaplık, clock ve bir uuid oluşturucu gibi yerleşik bağımlılıklar sağlar.

Burada indirgeyici, sürekli clock bağımlılığını alır.

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

Bir Bağımlılığı Etkide Kullanma

Bağımlılık tanımlandıktan sonra onu .run içinde kullanırsınız. clock enjekte edildiği için testler, zamanı isteğe bağlı olarak ilerleten bir test clock sağlayabilir.

Burada timer, enjekte edilen clock kullanılarak her saniye çalışır.

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

Kendi Bağımlılığınızı Tanımlama

Özel bağımlılıkları, bir değeri DependencyKey ile uyumlu hâle getirip bir liveValue sağlayarak kaydedersiniz. Ardından bir anahtar yoluna sahip olması için DependencyValues içine hesaplanmış bir özellik eklersiniz.

Burada bir API istemcisi birinci sınıf bir bağımlılığa dönüşür.

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

Özel Bağımlılığı Enjekte Etme

Anahtar yolu hazır olduğunda indirgeyici, istemciyi @Dependency(\.numberClient) ile tanımlar ve etkilerin içinde çağırır. Üretim ortamı canlı değeri kullanır; testler ise bunu geçersiz kılar.

Burada bir yeniden yükleme eylemi, enjekte edilen istemci aracılığıyla veri getirir.

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

Efektleri İptal Etme

Zamanlayıcılar gibi uzun süren efektler iptal edilebilir olmalıdır. Bir efekti cancellable kimliğiyle etiketler ve daha sonra başka bir eylemden .cancel ile iptal edersiniz.

Burada zamanlayıcı istendiğinde durdurulabilir.

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)

Hızlı Kontrol: Efektler ve Sonuçlar

Bir efektin sonucunu indirgeyiciye nasıl geri ilettiğini hatırlayınız.

Özet: Efektler ve Bağımlılıklar

TCA'nın yan etkileri ve bağımlılık eklemeyi nasıl yönettiğini öğrendiniz:

  • İndirgeyiciler saf kalır ve Effect değerleri döndürür; .none hiçbir iş yapılmayacağı anlamına gelir.
  • .run eşzamansız işi yürütür ve sonuçları await send(.action) aracılığıyla geri iletir.
  • Hatalar, efektin catch kapanışıyla ele alınır.
  • @Dependency, saat veya kendi istemcileriniz gibi hizmetleri ekler; bunlar DependencyKey ve DependencyValues aracılığıyla tanımlanır.
  • Uzun süren efektler kimlik kullanılarak cancellable yapılabilir.

Sırada özellikleri birlikte oluşturacak ve bunları kapsamlı biçimde sınayacaksınız.

import ComposableArchitecture

// Recap: pure reducer + Effect.run for async work
// + @Dependency for testable, injectable services.

Sıkça Sorulan Sorular

“Efektler ve Bağımlılıklar” dersi ücretsiz mi?

Evet — “Efektler ve Bağımlılıklar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.

“Efektler ve Bağımlılıklar” dersinde ne öğreneceğim?

Yan etkileri yönetin ve bağımlılıkları enjekte edin. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Swift Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Efektler ve Bağımlılıklar” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Durum, Eylem ve Reducer
  2. Store ve SwiftUI Entegrasyonu
  3. Efektler ve Bağımlılıklar
  4. Özellikleri Birleştirme ve Sınama
← Swift Academy Sayfasına Dön