يحتوي التطبيق الحديث على العديد من المتطلبات غير الوظيفية: حجم التطبيق ، وحركة المرور المستهلكة ، وسهولة الوصول للأشخاص ذوي الإعاقة ، والاستقرار ، وسرعة بدء التشغيل والتشغيل. بدأ تطبيقنا لفترة طويلة للغاية ، وعشرات الثواني. اليوم تم إصدار تحديث بدأ فيه تشغيل تطبيق iOS بشكل أسرع عدة مرات. أقول لك كيف حدث ذلك ولماذا الآن فقط.

يبدأ لفترة طويلة
يحتوي التطبيق على الكثير من التعليمات البرمجية والكثير من الفصول ويتم توصيلها بطريقة أو بأخرى. لإدارة هذه العلاقات ، استخدمنا
Dip (اقرأ: Swinject أو أي إطار DI آخر بدون إنشاء كود).
يعمل مثل هذا: في بداية التطبيق ، يتم تكديس كل التبعيات في "الحاوية" ، ثم يتم استخراج الفئة المطلوبة منه مع تبعية كل التبعيات. يستغرق وقتًا لبدء ، ويستغرق فتح أي شاشة وقتًا.
لكن الصور جميلة
لفترة طويلة ، لم يخيفنا ذلك: لقد رسمنا فقط شاشات توقف جميلة ببيتزا جديدة ولم تبخر. كان لا بد من إزالة شاشات توقف البيتزا عندما بدأنا في العديد من البلدان ، لأن المجموعة مختلفة في كل مكان. أصبحت الصورة غير مثيرة للاهتمام ، أصبح انتظار الإطلاق أكثر مملة ، لكننا أخطأنا هذه النقطة.
وهنا البقع لدينا. جميل ، لكن يختبئ مشكلة لم نحاول حلها.

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

الذباب إلى 4S؟ إصلاح في وقت لاحق
في هذا الوقت ، كان الخطأ "لم يبدأ إصدار الإصدار على 4S" مضطربًا في الأعمال المتراكمة ، على الرغم من إطلاق أخطاء التصحيح. لم يلاحظ أحد اتصال المشكلات ، ورفع الحد الأدنى من إصدار iOS إلى 10 ، كما أرجأ التغييرات. هناك عدد قليل من المستخدمين على 4S ، أليس كذلك؟
رأينا تراجع: ليس في البداية ، ولكن في التجميع
ومع ذلك ، أصبح من الواضح أن تراجع يحتاج إلى خفض. وما التغيير؟ في وقت مناسب للغاية ، صادفنا مادة
Dependency Injection في Swift .
إنه يعمل ببساطة: نكتب مجموعة من وظائف
resolve()
بنوع مختلف (المترجم سوف يكتشفها). لذلك ستتوقف الاتصالات عن احتسابها في البداية ، وسيتمكن المترجم من تحسين الكود. هذا مفيد أيضًا للتطوير: إذا وصفت التبعيات بشكل غير صحيح ، فستعرف عنها عند بدء التشغيل ، وليس عند فتح الشاشة. بالطبع ، هناك مشاكل: إذا لم تفهم الدالة
resolve()
الدالة النوع ، فسينتج عن هذا الخطأ عديم الجدوى مع مئات المرشحين:

لقد فعلنا هذا مرة أخرى في نوفمبر. كانت هناك تغييرات VERY MUCH ، وفي تلك اللحظة أطلقنا منتج Combo الجديد وأعدنا لأحدث التغييرات قبل السنة الجديدة. ظهر الرمز الجديد في المشروع قبل حلول العام الجديد ، لكننا لم نصدره إلا في شهر يناير بسبب الترميز قبل العطلة. لهذا ، لمدة ثلاثة أسابيع ، استخدمنا البرنامج في وضع الاختبار ، ووجدنا المشكلات وقمنا بإصلاحها.
هذه هي الطريقة التي يظهر بها رمز التبعية الآن. القذرة ولكن العمل. 450 مكان مع تسجيل و 1400 مكان مع استخراج.

من الناحية الوظيفية ، الكود هو نفسه ، تختلف طريقة التعامل معه فقط. الفرق في السرعة مرئي في جميع الطرز. في XS - أسرع مرتين ، وفي SE ، انظر بنفسك:
لذلك قمنا بتسريع ليس فقط البداية ، ولكن أيضًا فتح الشاشات. قبل التغييرات ، استغرق كل شاشة 0.3-1 ثانية فقط على الاعتماد.
سنة جديدة دون البيتزا
في ديسمبر ، بدأوا في الكتابة إلينا بأن التطبيق يتعطل عند بدء التشغيل ، ولا يبدأ ، وبعد إعادة التشغيل ، لا تساعد إعادة التثبيت. في السابق ، كان هناك سبب واحد فقط لهذا - عمليات ترحيل قاعدة البيانات ، لكننا تخلصنا منها ، ولم نر حالات مغادرة جديدة في Crashlytics. ما الخطأ الذي حدث؟

الفرضية: يسقط نظام التشغيل iOS هذه التطبيقات إذا كانت تعمل لفترة طويلة. تم تأكيد الإصدار من خلال حقيقة أن جميع المراجعات كانت من الأجهزة القديمة: 5 ، 5S ، 6. زاد عدد هذه المراجعات بشكل كبير ، لأن البيتزا هي عطلة ، وغالبًا ما يطلبها الناس للعام الجديد. يشعر الفريق بالقلق ، والمنتج قلق ، لكننا نطرح الإصدار الجديد فقط في يناير.
كنا محظوظين لأن الحل تمت كتابته ولا يمكن اختباره إلا. في سيناريو آخر ، يمكن قضاء أشهر في البحث عن الأسباب وتصحيحها.
في بعض الأحيان يكون من الصعب نقل أهمية المهمة الفنية إلى شركة ما: لا توجد مقاييس ، والأهمية ليست واضحة ، ولا يتم التنبؤ بالخطر. يمكن للأعمال حل المشكلة بطرق مختلفة: هذه هي الطريقة التي رسمنا بها صورًا جميلة ، بدلاً من تسريع التطبيق. لكن الأداء مهم لكل مستخدم. يؤثر بشكل كبير على:
- الانتظار. إذا بدأ التطبيق لفترة طويلة ، فكم من الوقت سيستغرقون البيتزا؟
- من دواعي سروري استخدام. لماذا غبي على كل شاشة؟
- وحتى من أجل الاستقرار. "التطبيق لا يعمل !!! المطورين ، هل اختبار هناك على الإطلاق؟ "(C).
وتجاوز Dip ، Swinject وغيرها من الأطر التي تعمل مع الحاويات في الوقت الحقيقي إذا كان لديك مشروع كبير والكثير من التبعيات.
حتى لا تفوتك المقالة التالية ، اشترك في قناة Dodo Pizza Mobile.