0Pricing
Swift Academy · درس

تحويل التدفقات ودمجها

استخدم flatMap و merge و combineLatest و zip.

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

العمل مع التدفقات

في Combine، يرسل الناشر تدفقًا من القيم بمرور الوقت. وتأتي القوة الحقيقية من المشغلات التي تحوّل هذه التدفقات وتجمعها في تدفقات جديدة.

يغطي هذا الدرس أهم المشغلات الخاصة بالتحويل والجمع: flatMap وmerge وcombineLatest وzip.

map مقابل flatMap

تحوّل map كل قيمة إلى قيمة أخرى. أما flatMap فتتجاوز ذلك — إذ تحوّل كل قيمة إلى ناشر جديد وتسطح النتائج في تدفق واحد.

استخدم flatMap عندما يجب أن تطلق كل مدخلة عملية غير متزامنة أخرى.

تطبيق flatMap عمليًا

يُحوَّل هنا تدفق من معرّفات المستخدمين إلى تدفق من طلبات الشبكة، ثم تُسطح النتائج في تدفق واحد من المستخدمين.

userIdPublisher
    .flatMap { id in
        apiClient.fetchUser(id: id)
    }
    .sink { user in
        print("Loaded", user.name)
    }
    .store(in: &cancellables)

التحكم في التزامن داخل flatMap

يشترك flatMap افتراضيًا في جميع الناشرين الداخليين في الوقت نفسه. ويمكنك تقييد التزامن باستخدام maxPublishers لتجنب إغراق الخادم بالطلبات.

idsPublisher
    .flatMap(maxPublishers: .max(2)) { id in
        apiClient.fetchUser(id: id)
    }
    .sink { print($0) }
    .store(in: &cancellables)

merge

يجمع merge القيم من عدة ناشرين من النوع نفسه في تدفق واحد، ويرسل كل قيمة فور وصولها.

let combined = buttonTapA
    .merge(with: buttonTapB)

combined
    .sink { print("A tap from either button") }
    .store(in: &cancellables)

combineLatest

يرسل combineLatest قيمة عند إصدار أي ناشر من ناشري الإدخال قيمة، إذ يقرن أحدث قيمة من كل ناشر. وهو مناسب جدًا للتحقق من صحة النماذج عندما يجب أخذ عدة حقول في الاعتبار.

usernamePublisher
    .combineLatest(passwordPublisher)
    .map { name, pass in
        !name.isEmpty && pass.count >= 8
    }
    .sink { isValid in
        print("Form valid:", isValid)
    }
    .store(in: &cancellables)

سلوك combineLatest

ملاحظة: لا يصدر combineLatest أي قيمة حتى ينتج كل إدخال قيمة واحدة على الأقل. بعد ذلك، يؤدي كل إصدار جديد من أي إدخال إلى إرسال المخرج المدمج مع أحدث قيم المدخلات الأخرى.

zip

يقرن zip القيم حسب الفهرس: الأولى من A مع الأولى من B، والثانية مع الثانية، وهكذا. وينتظر أن تتوفر قيمة في كلا الجانبين عند كل موضع.

let names = ["Ann", "Bob", "Cy"].publisher
let ages = [30, 25, 41].publisher

names
    .zip(ages)
    .sink { name, age in
        print(name, "is", age)
    }
    .store(in: &cancellables)

combineLatest مقابل zip

من السهل الخلط بينهما:

  • combineLatest — يعمل عند إصدار أي قيمة، ويستخدم أحدث قيمة من كل ناشر
  • zip — يعمل فقط عند توفر أزواج متطابقة حسب الفهرس

استخدم combineLatest للحالة المباشرة، واستخدم zip لمحاذاة النتائج المتوازية واحدًا لواحد.

الجمع لتنفيذ العمل بالتوازي

يتألق zip عند تشغيل طلبات مستقلة بالتوازي وانتظار اكتمالها جميعًا.

fetchProfile
    .zip(fetchSettings)
    .sink { profile, settings in
        print("Both loaded")
    }
    .store(in: &cancellables)

تسلسل المشغلات

تسلسل خطوط المعالجة الفعلية عدة مشغلات معًا للتعبير عن تدفقات غير متزامنة معقدة بطريقة تصريحية.

searchTextPublisher
    .removeDuplicates()
    .flatMap { query in
        apiClient.search(query)
    }
    .map { results in
        results.prefix(10)
    }
    .sink { print($0) }
    .store(in: &cancellables)

اختبار سريع

اختبر معرفتك بالمشغلات.

مراجعة

لقد تعلمت تحويل التدفقات وجمعها:

  • flatMap — من قيمة إلى ناشر، ثم تسطيح النتائج
  • merge — تشبيك تدفقات من النوع نفسه
  • combineLatest — أحدث قيمة من كل ناشر، ويعمل عند إصدار أي قيمة
  • zip — أزواج متطابقة حسب الفهرس

تتيح لك هذه المشغلات تركيب منطق غير متزامن معقد بطريقة تصريحية.

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

هل درس «تحويل التدفقات ودمجها» مجاني؟

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

ماذا ستتعلم في «تحويل التدفقات ودمجها»؟

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

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

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

كم من الوقت يستغرق درس «تحويل التدفقات ودمجها»؟

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

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

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

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

  1. تحويل التدفقات ودمجها
  2. المجدولات وتعدد الخيوط
  3. عوامل معالجة الأخطاء
  4. الناشرون والمشتركون المخصصون
← العودة إلى Swift Academy