Grand Central Dispatch ile eşzamanlılık

Jan 24 2023
GCD nedir? Grand Central Dispatch, Apple tarafından 10 yılı aşkın bir süre önce, geliştiricilerin iş parçacıklarını manuel olarak oluşturmadan ve yönetmeden çok iş parçacıklı kod yazmasına yardımcı olmak için bir soyutlama olarak oluşturuldu. Eşzamanlılık, iki görevin çakışan zaman aralıklarında başlayabileceği, çalışabileceği ve tamamlanabileceği anlamına gelir.

GCD nedir?

Grand Central Dispatch, Apple tarafından 10 yılı aşkın bir süre önce, geliştiricilerin iş parçacıklarını manuel olarak oluşturmadan ve yönetmeden çok iş parçacıklı kod yazmasına yardımcı olmak için bir soyutlama olarak oluşturuldu.

Eşzamanlılık, iki görevin çakışan zaman aralıklarında başlayabileceği, çalışabileceği ve tamamlanabileceği anlamına gelir. iOS'ta eş zamanlılık elde etmenin üç yolu vardır: ileti dizileri, gönderme kuyrukları ve işlem kuyrukları.

"Doğrudan iş parçacığı oluşturmak yerine, iş görevlerini planlamak için GCD'yi kullanıyorsunuz ve sistem, kaynaklarından en iyi şekilde yararlanarak bunları sizin için gerçekleştiriyor. GCD, gerekli iş parçacıklarının oluşturulmasını üstlenecek ve görevlerinizi bu iş parçacıkları üzerinde planlayarak iş parçacığı yönetiminin yükünü geliştiriciden sisteme kaydıracaktır.”

GCD'nin en büyük avantajı, eşzamanlı kodunuzu yazarken donanım kaynaklarını düşünmeniz gerekmemesidir.

"Tüm gönderi kuyrukları ilk giren ilk çıkar (FIFO) veri yapılarıdır, bu nedenle görevler her zaman eklendikleri sırayla başlatılır."

İOS'ta temel olarak üç eşzamanlılık yolu vardır:

  • İş Parçacığı
  • sevk kuyrukları
  • operasyon kuyrukları

"İpliklerin dezavantajı, geliştiriciye ölçeklenebilir bir çözüm oluşturma yükünü devretmeleridir. Kaç tane iş parçacığı oluşturacağınıza karar vermeli ve bu sayıyı koşullar değiştikçe dinamik olarak ayarlamalısınız. Ayrıca uygulama, kullandığı iş parçacıklarının oluşturulması ve bakımıyla ilgili maliyetlerin çoğunu üstleniyor."

NSThread* myThread = [[NSThread alloc] initWithTarget:self
                                       selector:@selector(myThreadMainMethod:)
                                       object:nil];
[myThread start];

“A, DispatchQueueuygulamanızda eşzamansız ve eşzamanlı olarak görevleri gerçekleştirmenize izin veren, GCD kuyruğunun üstündeki bir soyutlama katmanıdır. Görevler her zaman kuyruğa eklendikleri sırayla yürütülür."

Seri Kuyruk ve Eşzamanlı Kuyruk

“Bir seri Sevk Kuyruğu aynı anda yalnızca bir görevi yerine getirir. Seri kuyruklar, veri yarışlarının oluşmasını önlemek için genellikle belirli bir değere veya kaynağa erişimi senkronize etmek için kullanılır.”

let serialQueue = DispatchQueue(label: "serialQueue")

serialQueue.async {
    print("Task 1 started")
    // Do some work..
    print("Task 1 finished")
}
serialQueue.async {
    print("Task 2 started")
    // Do some work..
    print("Task 2 finished")
}
Task 1 started
Task 1 finished
Task 2 started
Task 2 finished

let concurrentQueue = DispatchQueue(label: "concurrentQueue", 
                                    attributes: .concurrent)

concurrentQueue.async {
    print("Task 1 started")
    // Do some work..
    print("Task 1 finished")
}
concurrentQueue.async {
    print("Task 2 started")
    // Do some work..
    print("Task 2 finished")
}
Task 1 started
Task 2 started
Task 1 finished
Task 2 finished

"Bir işlem kuyruğu, eşzamanlı bir sevk kuyruğunun Kakao eşdeğeridir ve NSOperationQueue sınıfı tarafından uygulanır. Sevk kuyruklarının aksine, işlem kuyrukları görevlerin FIFO sırasına göre yürütülmesiyle sınırlı değildir ve görevleriniz için karmaşık yürütme sırası grafiklerinin oluşturulmasını destekler.”

NSOperationQueue* myQueue = [[NSOperationQueue alloc] init];
[myQueue addOperation:anOperation]; 
[myQueue addOperationWithBlock:^{
   /* Do something. */
}];

Ana sevk kuyruğu, uygulamanın ana iş parçacığında görevleri yürüten, küresel olarak kullanılabilir bir seri sıradır.

"Ağır işi bir arka plan kuyruğunda yapmaya başlayabilir ve işiniz bittiğinde ana kuyruğa geri gönderebilirsiniz."

DispatchQueue.main.async {
    self.tableView.reloadData()
}

İyi kodlamalar…