0Pricing
Swift Academy · Pelajaran

Logika Percobaan Ulang dan URLSession Latar Belakang

Mengimplementasikan jeda mundur eksponensial dan melanjutkan unduhan di latar belakang.

Logika Percobaan Ulang dan URLSession Latar Belakang adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Mengapa Melakukan Percobaan Ulang?

Kegagalan sementara (batas waktu habis, 503 Service Unavailable) dapat dipulihkan. Logika percobaan ulang meningkatkan ketahanan tanpa memerlukan intervensi pengguna.

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

Jeda Eksponensial

Perpanjang waktu tunggu di antara percobaan ulang secara bertahap agar server yang sedang terbebani tidak semakin kewalahan: 1 d, 2 d, 4 d.

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

Jitter untuk Mencegah Lonjakan Bersamaan

Tambahkan jitter acak pada jeda percobaan ulang agar klien yang mencoba kembali tidak semuanya mengakses server pada waktu yang sama.

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

Kesalahan yang Dapat dan Tidak Dapat Dicoba Ulang

Hanya coba ulang kesalahan sementara. Kesalahan klien (401, 400) tidak boleh dicoba ulang.

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
}

URLSession di Latar Belakang

Sesi latar belakang tetap melanjutkan pengunduhan meskipun aplikasi Anda ditangguhkan atau dihentikan.

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

URLSessionDelegate untuk Latar Belakang

Implementasikan URLSessionDelegate untuk menerima callback penyelesaian saat aplikasi dijalankan kembali setelah tugas latar belakang selesai.

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

Penangan Penyegaran Aplikasi di Latar Belakang

Di dalam AppDelegate, simpan penangan penyelesaian latar belakang dan panggil setelah semua tugas selesai.

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

Tugas Unduh dengan Sesi Latar Belakang

Gunakan downloadTask(with:) pada sesi latar belakang untuk pengunduhan berkas besar yang tahan terhadap gangguan.

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

Tugas Unggah di Latar Belakang

Sesi latar belakang juga mendukung tugas unggah yang terus berjalan saat aplikasi tidak sedang berjalan.

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

Memantau Kemajuan

Amati URLSessionTaskDelegate untuk melacak kemajuan unggah/unduh dan memperbarui antarmuka.

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

Menggabungkan Percobaan Ulang dengan Latar Belakang

Gunakan percobaan ulang di latar depan untuk panggilan API dan sesi latar belakang untuk pengunduhan atau pengunggahan yang berlangsung lama.

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

Pemeriksaan Singkat

Teknik apa yang mencegah klien yang mencoba ulang mengakses server pada saat yang sama?

Rangkuman Pelajaran

Implementasikan percobaan ulang dengan jeda eksponensial dan jitter untuk kesalahan sementara. Hanya coba ulang kesalahan 5xx dan kesalahan batas waktu. Gunakan URLSessionConfiguration.background dengan delegasi untuk pengunduhan atau pengunggahan yang harus tetap berjalan saat aplikasi ditangguhkan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Logika Percobaan Ulang dan URLSession Latar Belakang” gratis?

Ya — teks lengkap “Logika Percobaan Ulang dan URLSession Latar Belakang” 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 “Logika Percobaan Ulang dan URLSession Latar Belakang”?

Mengimplementasikan jeda mundur eksponensial dan melanjutkan unduhan di latar belakang. 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 4 dari 4.

Berapa lama pelajaran “Logika Percobaan Ulang dan URLSession Latar Belakang” 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

  1. URLSession data(from:) dengan async/await
  2. Codable: Menyandikan dan Menguraikan JSON
  3. Penanganan Error dan Kode Status HTTP
  4. Logika Percobaan Ulang dan URLSession Latar Belakang
← Kembali ke Swift Academy