Swift Academy · Ders

Eski geri çağırmaları/Combine'ı async/await'e uyarlama

Tamamlanma işleyicilerini withCheckedContinuation / withCheckedThrowingContinuation kullanarak sarmalayın ve Combine yayıncılarını basit for await döngüleri için AsyncSequence 'e uyarlayın.

2. ders / 38 adım

Eski geri çağırmaları/Combine'ı async/await'e uyarlama, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 3 dersinin 2. 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 3 dersten oluşur.

Neden köprü kurmalı?

Amaç: Geri çağrıları sarmalamak için devam ettirmeleri kullanın ve Combine akışlarını AsyncSequence olarak ele alın.

  • Devam ettirmeler (hata üretmeyen / hata üreten)
  • URLSession köprüleme örneği
  • Combine → for await tüketimi

Hata üretmeyen devam ettirme

Eski API başarısız olamıyorsa withCheckedContinuation kullanın. Tam olarak bir kez resume edin.

// Old-style API
func fetchName(completion: @escaping (String) -> Void) {
    // simulate async
    Task { try? await Task.sleep(nanoseconds: 80_000_000); completion("Ana") }
}

// Async wrapper using continuation (non-throwing)
func fetchName() async -> String {
    await withCheckedContinuation { (cont: CheckedContinuation<String, Never>) in
        fetchName { value in cont.resume(returning: value) }
    }
}

Task {
    let name = await fetchName()
    print("name:", name) // "Ana"
}

Hata üreten devam ettirme

Eski hataları throw ile dışarı aktarmak için withCheckedThrowingContinuation kullanın. Tek bir resume yolu olduğundan emin olun.

enum NetError: Error { case offline; case badStatus }

func loadNumber(completion: @escaping (Result<Int, Error>) -> Void) {
    Task {
        try? await Task.sleep(nanoseconds: 80_000_000)
        completion(.failure(NetError.offline))
    }
}

func loadNumber() async throws -> Int {
    try await withCheckedThrowingContinuation { (cont: CheckedContinuation<Int, Error>) in
        loadNumber { result in
            switch result {
            case .success(let v): cont.resume(returning: v)
            case .failure(let e): cont.resume(throwing: e)
            }
        }
    }
}

Task {
    do {
        let n = try await loadNumber()
        print(n)
    } catch {
        print("error:", error) // offline
    }
}

URLSession köprüleme

Tamamlanma işleyicisi API'lerini (örneğin URLSession) sarmalayarak temiz bir async throws işlevi elde edin. Tam olarak bir kez resume etmeyi unutmayın.

import Foundation

func getText(from url: URL) async throws -> String {
    try await withCheckedThrowingContinuation { (cont: CheckedContinuation<String, Error>) in
        let task = URLSession.shared.dataTask(with: url) { data, resp, err in
            if let err = err { cont.resume(throwing: err); return }
            guard let data = data, let text = String(data: data, encoding: .utf8) else {
                cont.resume(throwing: URLError(.badServerResponse)); return
            }
            cont.resume(returning: text)
        }
        task.resume()
    }
}

// Demo (works in environments with network access)
let demoURL = URL(string: "https://example.com")!
Task {
    do { let body = try await getText(from: demoURL); print(body.prefix(15)) }
    catch { print("network error:", error) }
}

Combine'ı AsyncSequence olarak kullanma

Birçok Combine yayıncısı .values özelliğini sunar; böylece özel köprüler olmadan yayımlanan değerler üzerinde for await kullanabilirsiniz.

import Combine
import Foundation

let subject = PassthroughSubject<Int, Never>()

// Consume Combine as AsyncSequence:
Task {
    var produced: [Int] = []
    for await value in subject.values {          // Publisher.values -> AsyncSequence
        produced.append(value)
        if produced.count == 3 { break }         // stop after 3 values
    }
    print("collected:", produced)                // e.g., [1,2,3]
}

// Publish a few values
var cancellables = Set<AnyCancellable>()
Timer.publish(every: 0.05, on: .main, in: .common)
    .autoconnect()
    .prefix(3)
    .scan(0) { acc, _ in acc + 1 }
    .sink { subject.send($0) }
    .store(in: &cancellables)

Yayıncı → AsyncStream

.values kullanılamıyorsa AsyncStream ile küçük bir köprü oluşturun. İşiniz bittiğinde aboneliği iptal etmeyi unutmayın.

import Combine

// Bridge ANY Publisher to AsyncSequence using AsyncStream (simple version)
extension Publisher {
    func asAsyncStream() -> AsyncStream<Output> {
        AsyncStream { continuation in
            let cancel = self.sink(
                receiveCompletion: { _ in continuation.finish() },
                receiveValue: { value in continuation.yield(value) }
            )
            continuation.onTermination = { _ in cancel.cancel() }
        }
    }
}

// Demo:
let pub = [10, 20, 30].publisher
Task {
    var sum = 0
    for await v in pub.asAsyncStream() { sum += v }
    print("sum:", sum) // 60
}

Hata üreten devam ettirmeyi kullanma

Hızlı kontrol: Hata üreten bir geri çağrıyı eşzamansız koda bağlamanın en iyi yolu nedir?

Özet

Özet: Eski geri çağrıları devam ettirmelerle (hata üreten veya üretmeyen) sarmalayın ve Combine akışlarını .values ya da küçük bir AsyncStream köprüsü kullanarak tüketin. resume işlemlerini tek seferlik tutun ve işlem tamamlandığında abonelikleri iptal edin.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Swift öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
122
Dersler
409

Sıkça Sorulan Sorular

“Eski geri çağırmaları/Combine'ı async/await'e uyarlama” dersi ücretsiz mi?

Evet — “Eski geri çağırmaları/Combine'ı async/await'e uyarlama” 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 3 dersten oluşur.

“Eski geri çağırmaları/Combine'ı async/await'e uyarlama” dersinde ne öğreneceğim?

Tamamlanma işleyicilerini withCheckedContinuation / withCheckedThrowingContinuation kullanarak sarmalayın ve Combine yayıncılarını basit for await döngüleri için AsyncSequence 'e uyarlayın. 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, 3 dersinin 2. dersidir.

“Eski geri çağırmaları/Combine'ı async/await'e uyarlama” 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. Üretici/tüketici, işlem hatları ve zaman aşımı
  2. Eski geri çağırmaları/Combine'ı async/await'e uyarlama
  3. Async kodu sınama (XCTest)
← Swift Academy Sayfasına Dön