Sobes.tech
Middle

Əsas (off main thread) olmayan iş parçaları ilə işləmək nədir?

sobes.tech Süni İntellekt

AI-dan cavab

İşlərlə əsas axından fərqli axınlarda işləmək, resurs tələb edən və ya uzunmüddətli əməliyyatların (məsələn, şəbəkə sorğuları, məlumatların emalı, verilənlər bazası ilə işləmək) fon rejimində yerinə yetirilməsini nəzərdə tutur ki, əsas axın (UI Thread) bloklanmasın. Bu, istifadəçi interfeysinin cavabdehliyini qorumaq üçün çox vacibdir.

iOS-da bunun üçün ən çox istifadə olunanlar:

  1. Grand Central Dispatch (GCD): Tapşırıqların paralel və eyni vaxtda yerinə yetirilməsi üçün yüksək performanslı texnologiya.

    • Üstünlüklər: İstifadə asanlığı, thread hovuzlarının avtomatik idarə olunması, performansın optimallaşdırılması.
    • Çatışmazlıqlar: Əməliyyatların ləğvi zamanı çətinliklər, Operation Queues ilə müqayisədə tapşırıqların həyat dövrünün idarə olunmasında daha az çeviklik.

    GCD istifadə nümunəsi:

    // Qlobal sıraya (fon axını) tapşırıq yerinə yetirmək
    DispatchQueue.global(qos: .userInitiated).async {
        // Uzun əməliyyatınızı yerinə yetirin
        print("Fon axınında tapşırıq yerinə yetirilir")
    
        // Bitdikdən sonra, UI-ni yeniləmək lazımdırsa, əsas axına qayıdın
        DispatchQueue.main.async {
            // UI-ni yeniləyin
            print("Əsas axında UI yenilənir")
        }
    }
    
  2. Operation Queues (NSOperationQueue/Operation): GCD üzərində obyekt yönümlü qabıq, tapşırıqları daha çevik idarə etməyə imkan verir.

    • Üstünlüklər: Əməliyyatlar arasında asılılıqları idarə etmək, əməliyyatların ləğvi, təkrar istifadə və dayandırma imkanı.
    • Çatışmazlıqlar: Sadə tapşırıqlar üçün GCD ilə müqayisədə sintaksis daha mürəkkəb ola bilər.

    OperationQueue istifadə nümunəsi:

    // Əməliyyat növbəsini yaradın
    let operationQueue = OperationQueue()
    
    // Əməliyyatı yaradın (BlockOperation istifadə edə və ya öz sinfinizi yaza bilərsiniz, Operation-dan irsi)
    let myOperation = BlockOperation {
        // Uzun əməliyyatınızı yerinə yetirin
        print("Fon əməliyyatında tapşırıq yerinə yetirilir")
    }
    
    // Əməliyyatı növbəyə əlavə edin
    operationQueue.addOperation(myOperation)
    
  3. Manual Threads (NSThread): Ən aşağı səviyyəli üsul, thread-ləri əl ilə yaratmağa və idarə etməyə imkan verir.

    • Üstünlüklər: Thread üzərində tam nəzarət.
    • Çatışmazlıqlar: Yüksək mürəkkəblik, thread-in həyat dövrünün əl ilə idarə olunması, sinxronizasiya və yarış vəziyyətlərinin qarşısını almaq. Müasir iOS inkişafında çox vaxt istifadə edilmir.

    NSThread istifadə nümunəsi (çox nadir hallarda):

    // Thread yaradın və başlayın
    let myThread = Thread {
        // Yeni thread-də yerinə yetirilən kod
        print("NSThread ilə yeni thread-də yerinə yetirilir")
    }
    myThread.start()
    

Əsas thread-dən kənarda işləməyin üstünlükləri:

  • UI-nin cavabdehliyi: İstifadəçi interfeysi hamar və cavabdeh qalır, çünki əsas thread bloklanmır.
  • Performans: Tapşırıqların paralel yerinə yetirilməsi ümumi performansı artıra bilər, çox nüvəli prosessorlardan istifadə etməklə.
  • İstifadəçi təcrübəsinin yaxşılaşdırılması: İstifadəçi uzunmüddətli əməliyyatlar zamanı "donmuş" tətbiqi görmür.

Vacib məqamlar:

  • UI yeniləməsi: Hər hansı UI elementlərinin yenilənməsi yalnız əsas (UI) thread-də edilməlidir. Fon axınından UI-ni yeniləməyə cəhd etmək, qeyri-təxmin edilən davranışlara və ya tətbiqin çökməsinə səbəb ola bilər.
  • Sinxronizasiya: Bir neçə thread-dən ümumi resurslar (dəyişənlər, obyektlər) ilə işləyərkən, sinxronizasiya mexanizmlərindən (semaforlar, kilidlər, barier queue-lər) istifadə etmək lazımdır ki, yarış vəziyyətləri qarşısını alınsın.
  • Əməliyyatların ləğvi: Uzunmüddətli fon tapşırıqları üçün, onların ləğv edilə bilməsini təmin etmək vacibdir, məsələn, istifadəçi ekranı tərk etdikdə. Operation Queues bunun üçün daxili mexanizm təklif edir. GCD-də bu daha çətindir.

GCD və Operation Queues arasındakı seçim, tapşırığın xüsusiyyətlərindən asılıdır. Sadə fon əməliyyatları üçün GCD kifayət edir. Daha mürəkkəb ssenarilər üçün, asılılıqlar və ya ləğv etmə ehtiyacı ilə, Operation Queues üstünlük təşkil edir. NSThread isə müasir inkişafda nadir hallarda istifadə olunur.