0Pricing
Swift Academy · Ders

Yeniden Deneme Mantığı ve Arka Plan URLSession

Üstel geri çekilmeyi uygulayın ve indirmeleri arka planda sürdürün.

Yeniden Deneme Mantığı ve Arka Plan URLSession, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 4. 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.

Neden Yeniden Deneme?

Geçici hatalar (zaman aşımları, 503 Hizmet Kullanılamıyor) düzeltilebilir. Yeniden deneme mantığı, kullanıcı müdahalesi olmadan dayanıklılığı artırır.

func fetch(retries: Int = 3) async throws -> Data {
  for attempt in 0..<retries {
    do {
      return try await URLSession.shared.data(from: url).0
    } catch {
      if attempt == retries - 1 { throw error }
    }
  }
  fatalError("unreachable")
}

Üstel Bekleme

Zorlanan bir sunucuyu aşırı yüklememek için yeniden denemeler arasında giderek daha uzun süre bekleyin: 1 sn, 2 sn, 4 sn.

for attempt in 0..<maxRetries {
  do { return try await fetch() } catch {
    if attempt < maxRetries - 1 {
      try await Task.sleep(nanoseconds: UInt64(pow(2.0, Double(attempt))) * 1_000_000_000)
    } else { throw error }
  }
}

İstek Yığınını Önlemek için Jitter

Yeniden deneme yapan istemcilerin aynı anda sunucuya yüklenmemesi için bekleme sürelerine rastgele jitter ekleyin.

let baseDelay = pow(2.0, Double(attempt))
let jitter = Double.random(in: 0..<1)
let delay = (baseDelay + jitter) * 1_000_000_000
try await Task.sleep(nanoseconds: UInt64(delay))

Yeniden Denenebilir ve Yeniden Denenemeyen Hatalar

Yalnızca geçici hataları yeniden deneyin. İstemci hataları (401, 400) yeniden denenmemelidir.

func isRetryable(_ error: Error) -> Bool {
  if let urlErr = error as? URLError {
    return urlErr.code == .timedOut || urlErr.code == .networkConnectionLost
  }
  if let netErr = error as? NetworkError, case .httpError(let code) = netErr {
    return code >= 500
  }
  return false
}

Arka Plan URLSession

Arka plan oturumu, uygulamanız askıya alınsa veya sonlandırılsa bile indirmeleri sürdürür.

let config = URLSessionConfiguration.background(withIdentifier: "com.myapp.background")
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

Arka Plan için URLSessionDelegate

Arka plan görevi tamamlandıktan sonra uygulama yeniden başlatıldığında tamamlanma geri çağrılarını almak için URLSessionDelegate uygulayın.

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
  let dest = documentsURL.appendingPathComponent("download.pdf")
  try? FileManager.default.moveItem(at: location, to: dest)
}

Arka Plan Uygulama Yenileme İşleyicisi

AppDelegate içinde arka plan tamamlanma işleyicisini kaydedin ve tüm görevler tamamlandığında çağırın.

func application(_ app: UIApplication, handleEventsForBackgroundURLSession id: String, completionHandler: @escaping () -> Void) {
  backgroundCompletionHandler = completionHandler
}
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
  DispatchQueue.main.async { self.backgroundCompletionHandler?() }
}

Arka Plan Oturumuyla İndirme Görevi

Dayanıklı büyük dosya indirmeleri için arka plan oturumunda downloadTask(with:) kullanın.

let task = session.downloadTask(with: URL(string: "https://cdn.example.com/large.zip")!)
task.resume()

Arka Planda Yükleme Görevi

Arka plan oturumları, uygulama çalışmıyorken de devam eden yükleme görevlerini destekler.

var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let task = session.uploadTask(with: request, fromFile: localFileURL)
task.resume()

İlerlemeyi İzleme

Kullanıcı arayüzünü güncellemek üzere yükleme ve indirme ilerlemesini izlemek için URLSessionTaskDelegate kullanın.

func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
  let progress = Double(totalBytesSent) / Double(totalBytesExpectedToSend)
  DispatchQueue.main.async { self.uploadProgress = progress }
}

Yeniden Denemeyi Arka Planla Birleştirme

API çağrıları için ön plan yeniden denemesini, uzun süren indirme ve yüklemeler içinse arka plan oturumlarını kullanın.

// API calls: async/await + exponential backoff retry
// Large downloads: URLSessionConfiguration.background + delegate

Hızlı Kontrol

Yeniden deneme yapan istemcilerin aynı anda sunucuya yüklenmesini hangi teknik önler?

Ders Özeti

Geçici hatalar için üstel bekleme ve jitter kullanarak yeniden deneme uygulayın. Yalnızca 5xx ve zaman aşımı hatalarını yeniden deneyin. Uygulamanın askıya alınmasından sonra da devam etmesi gereken indirme ve yüklemeler için bir temsilciyle birlikte URLSessionConfiguration.background kullanın.

Sıkça Sorulan Sorular

“Yeniden Deneme Mantığı ve Arka Plan URLSession” dersi ücretsiz mi?

Evet — “Yeniden Deneme Mantığı ve Arka Plan URLSession” 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.

“Yeniden Deneme Mantığı ve Arka Plan URLSession” dersinde ne öğreneceğim?

Üstel geri çekilmeyi uygulayın ve indirmeleri arka planda sürdürü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, 4 dersinin 4. dersidir.

“Yeniden Deneme Mantığı ve Arka Plan URLSession” 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. async/await ile URLSession data(from:)
  2. Codable: JSON Kodlama ve Kod Çözme
  3. Hata İşleme ve HTTP Durum Kodları
  4. Yeniden Deneme Mantığı ve Arka Plan URLSession
← Swift Academy Sayfasına Dön