Sobes.tech
Junior

Əsas (əsas) olmayan axınlarla işləmək nədir?

sobes.tech Süni İntellekt

AI-dan cavab

iOS-da əsas (main thread)-dən fərqli axınlarla işləmək, istifadəçi interfeysinin əsas axını bloklamadan, asinxron tapşırıqları yerinə yetirməyə imkan verir. Bu, xüsusən, şəbəkə sorğuları, məlumatların emalı və ya fayllarla işləmə kimi uzunmüddətli əməliyyatların yerinə yetirilməsində tətbiqin cavabvermə qabiliyyətini qorumaq üçün çox vacibdir.

Əsas mexanizmlər aşağıdakılardır:

  1. GCD (Grand Central Dispatch):

    • Aşağı səviyyəli C-əsaslı kitabxana.
    • Tapşırıq növbələrindən (DispatchQueue) istifadə edir.
    • Paralel və ardıcıl növbələr yarada bilər.
    • Qlobal (konkurrent) və əsas axın (main) üçün növbələrlə işləyir.
    • Kod bloklarını fon rejimində yerinə yetirmək üçün asandır.
    // Qlobal növbədə kod icrası
    DispatchQueue.global(qos: .userInitiated).async {
        // Uzunmüddətli tapşırıq
        print("Tapşırıq fon axınında yerinə yetirildi")
    
        // UI yeniləmək üçün əsas axına qayıt
        DispatchQueue.main.async {
            // UI-ni yeniləyin
            print("UI əsas axında yeniləndi")
        }
    }
    
  2. Operation Queues (Operation və OperationQueue):

    • GCD-ə əsaslanan daha yüksək səviyyəli abstraksiya.
    • Tapşırıqları Operation obyektləri kimi təqdim edir.
    • Əlaqədar əməliyyatlar arasında asılılıqları idarə etmək, dayandırmaq, ləğv etmək və yenidən başlamaq imkanı verir.
    • Çətin tapşırıq zəncirlərini idarə etmək üçün daha əlverişlidir.
    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if self.isCancelled { return }
            // Uzunmüddətli tapşırıq
            print("Əməliyyat fon axınında yerinə yetirildi")
    
            if self.isCancelled { return }
            // UI yeniləmək üçün əsas axına əlavə et
            OperationQueue.main.addOperation {
                 print("UI əməliyyatdan yeniləndi")
            }
        }
    }
    
    // Əməliyyat növbəsini yaradın
    let queue = OperationQueue()
    queue.qualityOfService = .userInitiated
    
    // Əməliyyatları növbəyə əlavə edin
    queue.addOperation(MyOperation())
    
  3. Async/Await (Concurrency):

    • Müasir Swift üçün asinxron proqramlaşdırma mexanizmi.
    • async açar sözündən istifadə edərək, asinxron funksiyaları işarələyir və await ilə onların tamamlanmasını gözləyir.
    • Asinxron kodun yazılmasını və oxunmasını sadələşdirir, "callback hell"-dən qaçınır.
    • Avtomatik olaraq axınlar arasında keçidi idarə edir.
    func fetchData() async -> Data? {
        // Şəbəkə sorğusunu təqlid edir
        try? await Task.sleep(nanoseconds: 1_000_000_000)
        print("Məlumatlar asinxron funksiyada alındı")
        return Data()
    }
    
    // Asinxron funksiyanı Task-dən çağırmaq
    Task {
        if let data = await fetchData() {
            print("Məlumatların ölçüsü: \(data.count)")
            // Avtomatik olaraq uyğun kontekstdə yerinə yetirilir (UI yeniləmək üçün main ola bilər)
        }
    }
    

Vacib aspektlər:

  • Thread Safety: Ümumi resurslara (dəyişənlər, obyektlər) müxtəlif axınlardan girişdə ehtiyatlı olun, məlumat yarışlarını (data races) qarşısını alın. Bloklamalar (locks), növbələr (serialləşdirmə üçün) və ya atomar əməliyyatlar istifadə olunur.
  • UI yeniləmək: UI elementlərini yalnız əsas axında (DispatchQueue.main və ya OperationQueue.main) yeniləyin. Fon axınından UI yeniləməyə cəhd etmək səhvlərə və ya qeyri-müəyyən davranışlara səbəb olar.
  • Optimizasiya: Tapşırığa uyğun mexanizmi seçin. GCD sadə asinxron bloklar üçün, Operation Queues mürəkkəb zəncirləri idarə etmək üçün, Async/Await isə müasir strukturlaşdırılmış asinxron kod üçün əlverişlidir.
  • Prioritetlər (QoS): Tapşırıqlar üçün xidmət keyfiyyətini (Quality of Service) göstərin ki, sistem onları düzgün idarə edə və resursları bölüşdürə bilsin.
Mexanizm Abstraksiya səviyyəsi Asılılıqları idarəetmə Ləğv/Dayandırma İstifadə rahatlığı
GCD Aşağı Yox (yalnız əsas) Çətin Orta
Operation Queues Yüksək Bəli Asan Orta/Yüksək
Async/Await Yüksək Qismən daxili Asan (Task) Yüksək

Fon axınlarının düzgün istifadəsi, iOS tətbiqlərinin səmərəli və cavab verən olmasını təmin etmək üçün çox vacibdir.