0Pricing
Swift Academy · درس

مدقّق الخيط الرئيسي والتعليق

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

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

Main Thread Checker

إن Main Thread Checker (MTC) أداة تشخيص في Xcode ترصد أثناء التشغيل استدعاءات واجهات UIKit/AppKit API المنفذة من خيوط خلفية.

// Enabled by default in Xcode Debug scheme:
// Product → Scheme → Edit → Diagnostics → ☑ Main Thread Checker
// Violating calls log a purple runtime warning in Xcode

مخالفات MTC الشائعة

يُعد تحديث واجهة المستخدم من معالجات الإكمال أو قوائم الانتظار الخلفية أكثر المخالفات شيوعًا.

URLSession.shared.dataTask(with: url) { data, _, _ in
  self.label.text = "Done"  // VIOLATION: background thread
}.resume()
// Fix:
DispatchQueue.main.async { self.label.text = "Done" }

MTC مع async/await

يضمن وسم فئة أو دالة بالصيغة @MainActor تشغيل جميع أساليبها على الخيط الرئيسي.

@MainActor
final class ProfileViewModel: ObservableObject {
  @Published var name = ""
  func load() async {
    name = try? await fetchName()  // always on main thread
  }
}

ما المقصود بالتعليق؟

يحدث التعليق عندما يُحجب الخيط الرئيسي مدة طويلة، مما يجعل التطبيق غير مستجيب. وينهي مراقب iOS التطبيقات التي تتعطل عند التشغيل (أكثر من 20 ثانية) أو بعد إجراء من المستخدم.

// Common causes:
// - Synchronous network calls on main thread
// - Heavy computation blocking main run loop
// - Deadlocks between DispatchQueues

قالب Hangs في Instruments

تسجل أداة Hangs في Xcode 14 والإصدارات الأحدث أحداث التعليق مع تتبعات مكدس كاملة لتشخيص حجب الخيط الرئيسي.

// Instruments → Hangs template
// Shows hang duration (ms), call stack, and responsible frame
// Look for synchronous I/O or heavy loops

Main Thread Checker في الاختبارات

يعمل MTC أيضًا أثناء اختبارات واجهة المستخدم. اضبطه في مخطط الاختبار لاكتشاف المخالفات ضمن تدفقات واجهة المستخدم الآلية.

// XCTestScheme Diagnostics → ☑ Main Thread Checker
// UI test violation = instant fail in CI

تقارير التعليق من MetricKit

يجمع MetricKit تقارير التعليق من تطبيقات الإنتاج في MXHangDiagnosticPayload.

func didReceive(_ payloads: [MXDiagnosticPayload]) {
  payloads.compactMap { $0.hangDiagnostics }.flatMap { $0 }.forEach {
    print($0.callStackTree)
  }
}

اكتشاف التعليقات باستخدام Instruments

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

// Time Profiler: look for long CPU bursts on main thread
// Core Animation: FPS drops to 0 during hang
// Hangs instrument: highlights exact frames where hang occurred

إصلاحات غير متزامنة للتعليقات الشائعة

انقل العمل كثيف الاستخدام للمعالج بعيدًا عن الخيط الرئيسي باستخدام Task.detached أو async let.

// HANG:
let processed = heavyProcessing(image)  // blocks main thread
// FIX:
let processed = await Task.detached(priority: .userInitiated) {
  heavyProcessing(image)
}.value

تجنب واجهات API المتزامنة على الخيط الرئيسي

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

// HANG: synchronous file read on main thread
let data = try! Data(contentsOf: largeFileURL)
// FIX:
let data = try await Task.detached { try Data(contentsOf: largeFileURL) }.value

حلقة التشغيل الرئيسية والمؤقتات

تسبب العمليات طويلة الأمد على حلقة التشغيل الرئيسية (ضمن استدعاءات RunLoop.main) تعليقات أيضًا. انقل العمليات الحسابية خارج الحلقة الرئيسية.

// AVOID: heavy work in main-thread timer callback
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
  processAllItems()  // slow!
}
// PREFER: dispatch to background
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
  Task.detached { processAllItems() }
}

تحقق سريع

ماذا يضمن إضافة @MainActor إلى فئة بشأن استدعاءات أساليبها؟

مراجعة الدرس

فعّل Main Thread Checker في مخطط Debug لاكتشاف مخالفات تحديث واجهة المستخدم من خيط خلفي. استخدم @MainActor مع ViewModels وواجهات العرض. وانقل العمل الثقيل خارج الخيط الرئيسي باستخدام Task.detached أو قوائم الانتظار الخلفية. واستخدم أداة Hangs وMXHangDiagnosticPayload في MetricKit لتشخيص التعليقات الفعلية.

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

هل درس «مدقّق الخيط الرئيسي والتعليق» مجاني؟

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

ماذا ستتعلم في «مدقّق الخيط الرئيسي والتعليق»؟

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

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

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

كم من الوقت يستغرق درس «مدقّق الخيط الرئيسي والتعليق»؟

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

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

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

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

  1. أساسيات Instruments: Time Profiler
  2. أداتا Allocations وLeaks في Instruments
  3. مدقّق الخيط الرئيسي والتعليق
  4. تحسين المسارات الساخنة: COW وInlining وSpecialisation
← العودة إلى Swift Academy