0Pricing
Swift Academy · درس

‏URLSession data(from:) مع async/await

اجلبوا البيانات بصورة غير متزامنة من REST APIs باستخدام واجهة URLSession الحديثة.

‏URLSession data(from:) مع async/await درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

واجهة URLSession الحديثة

يوفر Swift 5.5 والإصدارات الأحدث دوالًا غير متزامنة في URLSession، مثل data(from:delegate:)، التي تعلّق التنفيذ بدلًا من استخدام عمليات الاستدعاء.

let (data, response) = try await URLSession.shared.data(from: URL(string: "https://api.example.com/items")!)

دالة الجلب الكاملة

غلّفوا الاستدعاء داخل دالة غير متزامنة يمكنها طرح الأخطاء، لتصبح قابلة للتركيب والاختبار.

func fetchItems() async throws -> [Item] {
  let url = URL(string: "https://api.example.com/items")!
  let (data, _) = try await URLSession.shared.data(from: url)
  return try JSONDecoder().decode([Item].self, from: data)
}

الاستدعاء من SwiftUI

استدعوا الدوال غير المتزامنة من معدّل .task أو من Task { } داخل إجراء زر.

struct ItemList: View {
  @State private var items: [Item] = []
  var body: some View {
    List(items, id: \.id) { Text($0.name) }
      .task { items = (try? await fetchItems()) ?? [] }
  }
}

URLRequest للرؤوس المخصصة

أنشئوا URLRequest باستخدام الطريقة والرؤوس والنص، ثم مرّروه إلى data(for:).

var request = URLRequest(url: URL(string: "https://api.example.com/login")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONEncoder().encode(LoginBody(email: "a@b.com", password: "pass"))
let (data, _) = try await URLSession.shared.data(for: request)

التحقق من حالة HTTP

حوّلوا الاستجابة إلى HTTPURLResponse وتحققوا من رمز الحالة قبل فك الترميز.

let (data, response) = try await URLSession.shared.data(from: url)
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else {
  throw URLError(.badServerResponse)
}
let item = try JSONDecoder().decode(Item.self, from: data)

الإلغاء

يؤدي إلغاء Task الأصل تلقائيًا إلى إلغاء طلب URLSession الجاري تنفيذه.

let task = Task {
  let items = try await fetchItems()
  // ...
}
task.cancel() // cancels URLSession request if in-flight

تحميل البيانات

استخدموا upload(for:from:) لإرسال البيانات الثنائية أو عمليات تحميل النماذج بطريقة غير متزامنة.

var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let (data, _) = try await URLSession.shared.upload(for: request, from: imageData)

تنزيل الملفات

تنزّل download(from:) ملفًا إلى عنوان URL مؤقت على القرص بدلًا من تحميله إلى الذاكرة.

let (fileURL, _) = try await URLSession.shared.download(from: remoteURL)
let destURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("file.pdf")
try FileManager.default.moveItem(at: fileURL, to: destURL)

تهيئة URLSession مخصصة

أنشئوا جلسة مخصصة مع مهلات زمنية وسياسة تخزين مؤقت ودعم للعمل في الخلفية.

let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 30
config.requestCachePolicy = .reloadIgnoringLocalCacheData
let session = URLSession(configuration: config)

async bytes للبث

استخدموا bytes(from:) لبث بيانات الاستجابة سطرًا بسطر دون تخزين الاستجابة بأكملها مؤقتًا.

let (stream, _) = try await URLSession.shared.bytes(from: url)
for try await line in stream.lines {
  print(line)
}

الاختبار باستخدام URLProtocol

حاكوا استجابات الشبكة في الاختبارات من خلال اشتقاق فئة فرعية من URLProtocol وحقنها في تهيئة جلسة مخصصة.

class MockURLProtocol: URLProtocol {
  static var requestHandler: ((URLRequest) throws -> (HTTPURLResponse, Data))?
  // override canInit, startLoading, stopLoading
}

تحقق سريع

أي دالة غير متزامنة في URLSession تنزّل استجابة URL مباشرةً إلى ملف مؤقت على القرص؟

مراجعة الدرس

استخدموا URLSession.shared.data(from:) لطلبات GET غير المتزامنة، وdata(for:) مع URLRequest مخصص لطلبات POST وPUT، وdownload(from:) لتنزيل الملفات، وbytes(from:) للبث. تحققوا دائمًا من رمز حالة HTTP قبل فك الترميز.

الأسئلة الشائعة

هل درس «‏URLSession data(from:) مع async/await» مجاني؟

نعم — نص درس «‏URLSession data(from:) مع async/await» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏URLSession data(from:) مع async/await»؟

اجلبوا البيانات بصورة غير متزامنة من REST APIs باستخدام واجهة URLSession الحديثة. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «‏URLSession data(from:) مع async/await»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏URLSession data(from:) مع async/await
  2. ‏Codable: ترميز JSON وفك ترميزه
  3. معالجة الأخطاء ورموز حالة HTTP
  4. منطق إعادة المحاولة وURLSession في الخلفية
← العودة إلى Swift Academy