iOS / Swift / دليل حلول تحريري
تشخيص المهام القديمة ونتائج الجلسات
أعد إنتاج اكتمال الممثل غير المرتب دون خلط الإلغاء وعمر العرض وملكية الحساب الحالي.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
يعرض البحث النتيجة الصحيحة مؤقتا ثم يستبدلها رد قديم، وقد يغطي فشل قديم نجاحا أحدث.
النموذج معزول على الممثل الرئيسي ويطلب الإلغاء عند تغير المدخل، لكن العيب باق. وقد تنشر حالة مشابهة بيانات الحساب السابق بعد الخروج والدخول.
افهم الأسباب المحتملة
- يمنع العزل الوصول غير المنظم ولا يجعل التدفق ذريّا عبر await. والإلغاء تعاوني وقد يصل بعد اكتمال العمل.
- قد يُحمى النجاح دون الخطأ أو تنظيف الانشغال. وقد يعيش النموذج أو المخزن بعد جلسته الأصلية.
التقط ترتيب الأحداث بهويات آمنة
ابن إعادة إنتاج مصطنعة بالطلبين A وB وسجّل البدء والاكتمال وملاحظة الإلغاء والنشر كأحداث مختلفة. أدرج جيل جلسة عند تغير الحساب، دون أسرار أو استعلام خاص كامل. لا يلزم من بدء A أولا اكتمالها أولا؛ فالترتيب المعكوس طبيعي. الفشل اعتماد نتيجة لا تخص المدخل الحالي. وافحص هل تعاد مهمة SwiftUI بسبب تغير id أم تغير هوية العرض بلا قصد.
أعلن العملية المخولة بالنشر
استخدم للبحث المباشر سياسة أحدث مدخل بتذكرة قبل await. وإذا بقي العرض عبر تبديل الحساب فالتقط هوية الجلسة. لا تنشر إلا مع تطابقهما، وطبّق البوابة على الخطأ والانتظار أيضا. لا يمح الطلب القديم مؤشر الجديد. أبق الإلغاء لتحسين الموارد وإشارة العمر، والهوية حد صحة محلي. وتحتاج المعاملة سياسة أخرى فقد قبل الخادم أمرا أقدم.
اختبر بوابة النشر مستقلة
يوضح المقتطف المقارنة الحاسمة دون مهمة أو خدمة. لا يكفي تطابق رقم الطلب إذا اختلفت الجلسة. يحدّث المالك الفعلي الهوية عند البدء أو تغير الحساب ويقارن قبل كل تعديل. لا يقرأ البديل حسابا عاما متغيرا عند النهاية فقط، فيخفي حساب البدء. التقط الملكية من البداية واحفظها خلال العملية.
struct ResultOwner: Equatable, Sendable {
let session: Int
let request: Int
}
let started = ResultOwner(session: 1, request: 4)
let current = ResultOwner(session: 2, request: 4)
print(started == current)
false
ترفض المساواة نتيجة جلسة سابقة، ولا تلغي مهمة أو تثبت تفويض الخدمة.
أعد إنتاج الاكتمال القديم الناجح والفاشل
استخدم مستودعا مزيفا بردود معلقة. ابدأ A ثم B وأكمل B بنجاح ثم A وافحص بقاء B. كرر برمي A ثم بالخروج وجلسة جديدة قبل اكتمالها. وأضف اختفاء العرض مع بقاء النموذج عمدا وافحص السياسة بدلا من افتراض انتهاء النموذج. استأنف كل استمرار مرة واحدة بما فيه تنظيف اختبار فاشل. لا يلزم نوم زمني أو وجهة حية.
تحقق من نجاح الإصلاح
تبقى أحدث نتيجة بعد النجاح والفشل القديمين، ولا يمح العمل القديم الانتظار الحالي، ويمنع تغير الجلسة نشر الخاص وإشعارات مخزنه.
أبلغ عن فحوص النموذج المزيف منفصلة عن إلغاء SwiftUI ونقل URLSession وتشغيل Apple. لم تُنفذ تكاملات SDK أثناء التأليف.
امنع تكرار المشكلة
- أبق الحداثة والجلسة والإلغاء والعزل وتفويض الخادم عقودا صريحة. احفظ عينة الرد المؤجل وراجع كل نجاح وcatch وانتظار عند تعديل العمل غير المتزامن.