iOS | Threading 1

cemal tüysüz
5 min readOct 30, 2022
https://www.independent.ie/

Herkese selamlar, bu yazıda Senkron/Asenkron Programlama , Thread, Thread Safe ve Main Thread konularını inceliyor olacağız. Bu yazı ile beraber Threading işlemleri için iyi bir temel atıyor olacaksınız. Bir sonraki yazı da ise GCD(Grand Central Dispatch) ve Operations konularına değinerek bu yazıda öğrendiklerinizi pekiştiriyor ve sektörde kullanılan popüler apiler hakkında bilgi ediniyor olacaksınız. Hazırsanız başlayalım !

Senkron/Asenkron Programlama

from https://www.learnupon.com/

Senkron programlama, yazılan kodun sıra ile ilerlemesidir. Var olan tek bir akış ile ilerlemektir. Bunu yaparken başka herhangi bir iş ile ilgilenmiyor olmaktır. Senkron programlamaya bir örnek verelim.

Bir kafe işlettiğinizi düşünün. Tek çalışan sizsiniz. Arka arkaya 3 farklı müşteri geldi ve siparişlerini verdiler. Bu durumda öncelikle birinci ardından ikinci ve üçüncü siparişleri hazırlayıp teslim etmeniz gerekir. Senkron bir çalışmada bu siparişler kendilerinden bir önceki siparişin/işin bitirilmesini beklemek zorundadırlar.

from https://atarikguney.medium.com/

Asenkron Programlama, yazılan programda istenilen kapsamın var olan akışın haricinde ayrı bir akış ile devam ediyor olmasıdır. Asenkron programlamaya bir örnek verelim.

Aynı şekilde kafe mantığı ile ilerleyecek olursak, bu sefer gelen 3 farklı siparişte ikinci siparişin birinci siparişi beklemesine veya üçüncü siparişin birinci veya ikinci siparişi beklemesine gerek yok.

Bu durumda 2 farklı senaryo olabilir. Birincisi tek başınıza çalıştığınız bu kafe için her bir sipariş ile bir adam ilgilenecek şekilde 2 personel daha aldınız. Bu kişiler ile aynı anda siparişleri yapmaya başladınız. Var olan tek bir akış (sizin akışınız) artarak 3 farklı akışa yükselmiş oldu.

İkinci senaryo ise biraz ütopik gelebilir ama thread kısmında daha iyi anlayacağınızı umuyorum, birden fazla kola sahip olma yeteneğine sahipsiniz. 3 siparişi birbirlerini beklemeden oluşturabilmek için ekstradan 4 kol daha oluşturursunuz ve aynı anda bu siparişleri yapmaya başlarsınız. Bu durumda tek bir akışımız var (sizin akışınız) lakin bu akış kendi içerisinde birden fazla akışa sahip olarak aynı anda farklı siparişleri yapabiliyor duruma geliyor.

Thread

Thread iş parçacığı anlamına gelmektedir. Thread akışın kendisidir. Bir program yürütülebilmek için bir thread e yani bir iş parçacığına ihtiyaç duyarız. Ayrıca bir iş parçacığı kendi içerisinde birden fazla iş parçacığı da barındırıyor olabilir. Bu duruma da Multi-Threading ismi verilir.

Kafe örneğinde bahsettiğimiz siparişler için işe alabiliyor olacağınız fazladan personellerin her biri ve siz bir Thread siniz. Sipariş hazırlamak bir program ise yürütülmek için sizlere ihtiyaç duyarlar.

  • Siparişlerin hazırlanmasını tek başınıza iki kol ile yaparsanız tek bir thread ile bu işi yürütmüş ve bu işi senkron bir biçimde gerçekleştirmiş olursunuz
  • Siparişlerin hazırlanması için yanınıza iki personel daha alırsanız birden fazla thread ile çalışmış ve bu işi asenkron bir biçimde gerçekleştirmiş olursunuz.
  • Siparişleri hazırlamak için 6 kol ile tek başınıza çalışırsanız tek bir thread içerisinde farklı akışlar oluşturarak yine asenkron çalışmış olursunuz.

Android veya iOS cihazlarda işletim sistemi fark etmeksizin oluşturabileceğiniz Thread sayısı telefonunuzda kaç adet çekirdek bulunduğu ile doğru orantılıdır. Ne kadar çok çekirdek o kadar hızlı telefon.

Main Thread

Main thread ana iş parçacağı anlamına gelmektedir. Android veya iOS işletim sistemlerinde oluşturduğumuz bir mobil uygulama ayağa kalktığında Main thread ile ayağa kalkar. Main thread önemlidir çünkü bloklanması gibi durumlarda uygulama crash olabilir. Bu yüzden sadece UI işlemlerini karşılaması beklenir. Hatta UI da yapılması gereken bazı güncellemeleri de duruma göre main thread içerisinde asenkron bir şekilde yapılması daha iyi olabilir. Network veya DB işlemleri ise zaten main thread içerisinde yapılmamalıdır. Bunun sebebi ise db ve network işlemleri maliyetli olmak ile beraber süresi kestirilemez ve ana iş parçacığı bu işler ile ilgileniyorken gelecek herhangi bir UI isteğinin (button click, scroll, page navigate etc.) karşılanamayacak olmasıyla beraber uygulamanın çökmesidir.

Swift İle Thread Oluşturalım

Bu bölümde Thread sınıfından yardım alarak yeni bir thread oluşturup bir kod bloğunu ayrı bir akışta çalıştıracağız. Aşağıdaki kod bloğunu inceleyelim.

Example adında bir sınıf oluşturup bu sınıfın en dış kapsamına iki adet liste oluşturdum. Amacımız bu listelerin elemanlarını yazdırmak. Bunu 15. satırda yer alan runClass fonksiyonunda gerçekleştiriyoruz.

Yeni bir thread oluşturmak için Target parametresine Selector kısmına vereceğimiz @objc fonksiyonunu nerede çalıştıracağımızı veriyoruz. Fonksiyonumuz aynı sınıfta yer aldığı için self dememiz yeterli olacaktır. Selector kısmını ayrı thread üzerinde çalıştırmak istediğimiz fonksiyonu veriyoruz. Object parametresine de oluşturduğumuz Thread e göndermek istediğimiz bir parametre var ise onu iletiyoruz yok ise burası nil de olabilir.

16. satırda liste A yı yazdırmak yeni bir thread oluşturulmuş oluyor. Sonrasında satır 17 de bu Thread i başlatıyoruz. Bu kısım artık asenkron bir biçimde çalışıyor ve liste A nın print olması beklenilmeden liste B nin print olması başlatılıyor.

Sonuç :

Eğer bu iki listeyi tek bir thread üzerinde yazdırıyor olsaydık önce liste A yı yazdırıp sonra B yi yazdıracaktık en başta da belirttiğim gibi.

Oluşturduğunuz Thread sınıfının çalışmayı bitirip bitirmediğini isFinished(), iptal edilip edilmediğini isCancelled() veya hala çalışıyor olup olmadığını isExecuting() yöntemleri ile kontrol edebilirsiniz. Thread sınıfı tamami ile kalıtım alınıp fonksiyonları override edilip özelleştirilebilir. Daha fazla bilgi edinmek için dökümantasyonu ziyaret edebilirsiniz.

Thread Safe

thread safe

Thread Safe Thread Güvenliği anlamına gelmektedir. Birden fazla thread ile çalışılan durumlarda ortaklaşa kullanılmak istenen bir yapının doğuracağı tutarsızlık ve problemlere karşı alınan önlemdir.

Android üzerinde Room veritabanı kullanıyorsunuz ve veritabanı işlerinizi halletmek için bir adet Singleton sınıf oluşturdunuz. Yapacağınız veritabanı işlemlerinizi ayrı bir thread de yada main de async olacak şekilde fakat write / read işlemlerini senkron bir şekilde halletmek istiyorsunuz çünkü veritabanına açacağınız birden fazla connection ve aynı anda yapılabilecek işlemler sizin için problem yaratabilir. Bu durumda bu sınıfı thread safe olarak oluşturmak zorundasınız. Yukarıdaki şemada ki gibi her bir thread bu sınıfı kullanıyorken bu sınıftan tek bir tane olmalı ve sıra ile kullanmalıdırlar.

Umarım faydalı bir yazı olmuştur. Bir başka yazıda görüşmek üzere, sağlıcakla kalın.

--

--