Sobes.tech
Middle

Ana iş parçacığından farklı iş parçacıklarıyla çalışma nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Ana akışlardan farklı akışlarla çalışmak, kaynak yoğun veya uzun süren işlemleri (örneğin, ağ istekleri, veri işleme, veritabanı ile çalışma) arka planda gerçekleştirerek ana akışın (UI Thread) engellenmemesini sağlar. Bu, kullanıcı arayüzünün yanıt verebilirliğini korumak için kritiktir.

iOS'ta bunun için en sık kullanılanlar şunlardır:

  1. Grand Central Dispatch (GCD): Görevlerin paralel ve rekabetçi yürütülmesi için yüksek performanslı teknoloji.

    • Avantajlar: Kullanım kolaylığı, otomatik thread havuzu yönetimi, performans optimizasyonu.
    • Dezavantajlar: İşlemleri iptal etmede zorluklar, Operation Queues'a kıyasla yaşam döngüsü yönetiminin daha az esnek olması.

    GCD kullanımı için bir örnek:

    // Global kuyrukta görev yürütme (arka plan akışı)
    DispatchQueue.global(qos: .userInitiated).async {
        // Uzun süren işlemi yapan kodunuz
        print("Arka planda görev yürütülüyor")
    
        // İşlem tamamlandıktan sonra UI'yi güncellemek gerekirse ana akışa dönün
        DispatchQueue.main.async {
            // UI güncellemesi
            print("Ana akışta UI güncellemesi")
        }
    }
    
  2. Operation Queues (NSOperationQueue/Operation): GCD üzerine nesne yönelimli sarmalayıcı, görevleri daha esnek yönetmenizi sağlar.

    • Avantajlar: İşlemler arasındaki bağımlılıkların yönetimi, işlemleri iptal etme, tekrar kullanma ve duraklatma imkanı.
    • Dezavantajlar: Basit görevler için GCD'ye kıyasla biraz daha karmaşık sözdizimi.

    OperationQueue kullanımı örneği:

    // İşlem kuyruğu oluşturma
    let operationQueue = OperationQueue()
    
    // İşlem oluşturma (BlockOperation veya kendi sınıfınızı kullanabilirsiniz, Operation'dan kalıtım almalı)
    let myOperation = BlockOperation {
        // Uzun süren işlemi yapan kod
        print("Arka planda görev yürütülüyor")
    }
    
    // İşlemi kuyruğa ekleme
    operationQueue.addOperation(myOperation)
    
  3. Manuel Thread'ler (NSThread): En düşük seviyeli yöntem, thread'leri manuel oluşturma ve yönetme imkanı sağlar.

    • Avantajlar: Thread üzerinde tam kontrol.
    • Dezavantajlar: Yüksek karmaşıklık, thread yaşam döngüsünü manuel yönetme ihtiyacı, senkronizasyon ve yarış durumlarından kaçınma. Modern iOS geliştirmede nadiren önerilir.

    NSThread kullanımı örneği (çok nadiren kullanılır):

    // Thread oluşturma ve başlatma
    let myThread = Thread {
        // Yeni thread'de çalıştırılacak kod
        print("NSThread kullanarak yeni thread'de çalışma")
    }
    myThread.start()
    

Ana dışındaki thread'te çalışma avantajları:

  • UI yanıt verebilirliği: Kullanıcı arayüzü akıcı ve yanıt verir durumda kalır, çünkü ana thread engellenmez.
  • Performans: Paralel görev yürütme, uygulamanın genel performansını artırabilir, çok çekirdekli işlemcilerden yararlanır.
  • UX iyileştirmesi: Kullanıcı, uzun süren işlemler sırasında "donma" yaşayan uygulamayı görmez.

Önemli noktalar:

  • UI güncelleme: Herhangi bir UI öğesinin güncellenmesi sadece ana (UI) thread'de yapılmalıdır. UI'yi arka plan thread'inden güncellemeye çalışmak, öngörülemeyen davranışlara veya uygulama çökmesine neden olur.
  • Senkronizasyon: Birden fazla thread'den paylaşılan kaynaklar (değişkenler, nesneler) ile çalışırken, yarış durumlarını önlemek için senkronizasyon mekanizmaları (semoforlar, kilitler, bariyer kuyrukları) kullanılmalıdır.
  • İşlemleri iptal etme: Uzun süren arka plan görevleri için, bunların iptal edilme imkânını sağlamak önemlidir, örneğin kullanıcı ekranı terk ettiğinde. Operation Queues yerleşik iptal mekanizması sunar. GCD'de bu daha zordur.

GCD ve Operation Queues arasındaki seçim, görevin doğasına bağlıdır. Basit arka plan işlemleri için GCD genellikle yeterlidir. Bağımlılıkları veya iptal gereksinimi olan daha karmaşık senaryolar için Operation Queues tercih edilir. NSThread ise modern geliştirmede nadiren kullanılır.