كيفية إنشاء جسور بين الأطر في تطبيق iOS

إذا كان رمز تطبيقك يبدو كالتالي ...

"أريد تصدير هذا الجزء من تطبيقي ولكنه مرتبط ببقية التطبيق مثل طبق معكرونة!"

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

عندما بدأت في تعديل جزء من التطبيق الذي كنت أعمل عليه ، واجهت جدارًا.

أردت تصدير خدمة (في الواقع كانت خدمة التعقب) في إطار منفصل. كانت المشكلة أن هذه الخدمة كانت مرتبطة بالكاد إلى التطبيق. كان يستخدم خدمة أخرى كانت تستخدم نفسها في خدمة أخرى مثبتة بعمق.

من أجل تصدير خدمة التتبع ، كان يتعين علي إعادة تشكيل وإعادة تشكيل مجموعة الخدمات بالكامل في الإطار الجديد!

ولكن الحقيقة هي أنه لم يكن لدي الوقت للقيام بذلك ، وكان اختبار الانحدار بمثابة كابوس ، ولأسباب أخرى كثيرة يمكن أن يكون لديك في أي شركة (العملية ، الميزانية ، الموعد النهائي).
لذلك اضطررت لمعرفة كيفية تصدير هذا الجزء من تطبيقي دون إعادة بيع كل شيء.

لنبدأ بمثال ملموس!

نحن هنا ، أفضل طريقة للتعلم وفهم كيفية عمل الأشياء هي الممارسة! (سأقدم ريبو جيثب لهذا المثال في نهاية هذا المنشور)
لذلك اسمحوا لي أن أضبط السياق ، لدينا تطبيق صغير به شاشتان فقط:

  • شاشة رئيسية
  • شاشة دفع (نريد تصدير تلك الشاشة إلى إطار عمل)

تحتوي صفحة الدفع على TextField لإدخال رقم البطاقة وزر الدفع. عندما تضغط على الزر ، يجب إطلاق الدفعة.
لكن ! يكمن التحدي في طريقة الدفع. لنفترض أننا لا نستطيع تصدير خدمة الدفع لبعض الأسباب التي استدعتني سابقًا.

الشاشة الرئيسية وشاشة الدفع

لذلك لدينا هذه الشاشتين ، أعلن في هدفين مختلفين. يتم الإعلان عن الشاشة الرئيسية في الهدف الرئيسي للتطبيق ، ويتم الإعلان عن شاشة الدفع في وحدة أخرى تسمى PaymentModule. لدينا أيضًا خدمة PaymentService معلن عنها في هدف التطبيق الرئيسي ، على النحو التالي:

طريقة الدفع هي الطريقة التي لا يمكننا استخراجها من التطبيق لأنها تعتمد بشكل كبير. لكننا نريد استخدامه من وحدة الدفع.

لدينا PaymentViewController معرّفة في وحدة الدفع ، إذا حاولنا الاتصال بخدمة PaymentService ، فسنحصل على خطأ لأن هذه الخدمة ليست في الوحدة النمطية. لا يمكنك استيراد الهدف الرئيسي داخل وحدة نمطية (سيكون هذا هراء)

فكيف سنستخدم هذه الطريقة من PaymentViewController؟

تحديد بروتوكول في الوحدة النمطية

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

لذلك دعونا نحدد بروتوكولًا يسمى PaymentServiceProtocol مع طريقة الدفع:

تنفيذ البروتوكول في التطبيق

الآن يتعين علينا إخبار خدمة الدفع لدينا بالامتثال لهذا البروتوكول. نحتاج فقط لإضافة هذا:

"لماذا لم يتم تنفيذ الطريقة المعلنة في البروتوكول في هذا التمديد؟"

أنت على صواب ، عند الامتثال لبروتوكول يجب عليك تنفيذ خصائصه وطرقه. الخدعة هنا هي أن اسم الطريقة في البروتوكول هو بالضبط نفس اسم الطريقة في خدمة PaymentService التي أعلنا عنها سابقًا. بهذه الطريقة ، سيعرف النظام أنه سيتعين عليه استخدام طريقة الدفع المعلنة في فئة خدمة الدفع عند الوصول إلى طريقة البروتوكول.

ربط الجزءين

يجب علينا الآن الانضمام إلى الجزأين معا.
من HomeViewController ، عندما نضغط على زر "اذهب إلى صفحة الدفع" ، فإننا نقوم بإنشاء مثيل لـ PaymentViewController. في ذلك الوقت ، سنقوم بإصدار إشارة إلى فئة PaymentService ، لكن وحدة تحكم الدفع في الوحدة النمطية ستراها كنوع PaymentServiceProtocol.

هنا الخدعة:

نحن نعبر PaymentService.self والرمز في الوحدة النمطية يشاهد PaymentServiceProtocol.Type.
الآن يمكننا استخدام استدعاء طريقة الدفع المحددة في التطبيق من وحدة!

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

أصبح من السهل جدًا الآن استخدام الجسر الذي أنشأناه:

يتم استدعاء الأسلوب didTapPayButton كلما نقرت على زر الدفع (يبدو صحيحًا ، صحيح؟). تحقق من السطر 23: نحن ندعو طريقة الدفع في مرجع البروتوكول الذي حصلنا عليه من التطبيق.

نظرًا لأن PaymentService يتوافق مع هذا البروتوكول ، فسيقوم النظام بتنفيذ التعليمات البرمجية داخل طريقة الدفع ، والتي تم تعريفها في PaymentService.swift.

بمعنى آخر ، نحن نستخدم الطريقة التي لم نتمكن من الاتصال بها من الوحدة في البداية! تم الآن تعيين الجسر.

إليك ما يبدو عليه عند النقر فوق زر الدفع.

باستخدام طريقة الدفع الواردة في الهدف الرئيسي ، من وحدة الدفع

استنتاج

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

ستتيح لك هذه التقنية استبعاد المعكرونة من الوعاء ، إذا كنت مضطرًا إلى تصدير هذا الجزء من التطبيق الخاص بك إلى إطار عمل ولكن لا يمكنك تصدير كل شيء ، لأي سبب يمكن أن يكون لديك.

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

أعترف أنه في عالم مثالي ، مع حيدات وأشياء خيالية ، لن نفعل شيئًا كهذا. نفضل تصدير المكون بالكامل ، لكن كما قلت مرات عديدة ، هذا غير ممكن دائمًا.

يمكنك العثور على Github repo لهذا المشروع هنا ، لا تتردد في التحقق من كيفية عمل الجسر وتجربته بنفسك.
آمل أن يساعد هذا المنشور ، لا تتردد في طرح أي سؤال لديك في الاعتبار!

تم نشر هذه القصة في The Startup ، أكبر منشور لريادة الأعمال في Medium ، يليه + 442،678 شخصًا.

اشترك لتلقي أهم الأخبار هنا.