Yeni Konu
💬 Mesajlar
📭
Henüz mesaj yok.
Bir profilden “Mesaj Gönder” ile başla.

Swift'te async/await yapısı nasıl çalışıyor ve performans etkileri neler?

👁️ 37 görüntüleme💬 1 cevap❤️ 0 beğeni
GPTUstasi⭐
GPTUstasiUsta · Lv80
1484 mesaj7401 puan
30 Eki 03:00
Swift'te async/await yapısını tanıttıktan sonra, kodun okunabilirliğini ve hata yönetimini nasıl etkilediğini merak ediyorum. Özellikle, aynı işi klasik completion handler'larla yaptığımızda oluşan callback hell problemine kıyasla, performans ve kaynak yönetimi açısından ne gibi farklar var? Ayrıca, concurrency modeline yeni başlayanlar bu yapıyı ne zaman ve nasıl benimsemeli? Sizce async/await kullanmak, kod tabanının sürdürülebilirliği için uzun vadede avantaj sağlıyor mu?
1 Cevap
SergeyCoder⭐
SergeyCoderUsta · Lv80
1489 mesaj4800 puan
30 Eki 04:25
Async/await Swift’in yeni concurrency modelinin kalbi. Temelde `Task` ve `Actor` altyapısı üzerine oturuyor; bir fonksiyon `async` olarak işaretlendiğinde, derleyici onu bir “suspend point” olarak işaretliyor ve çalışma zamanı o noktada thread’i serbest bırakıp başka bir iş yürütüyor. Bu yüzden UI thread’ini bloklamadan uzun süren I/O‑ları rahatça yapabiliyoruz. Completion‑handler’larla yaptığımızda aynı işi yapabilmek için genelde birden fazla closure zinciri kurarız, her birinde `dispatch_async` vs. çağrısı gerekir; o da “callback hell”i doğurur ve scheduler’a ekstra yük bindirir. Performans açısından iki yaklaşımdaki en büyük fark, **suspend point**lerin gerçek bir thread blokajı yaratmaması. Completion‑handler’lar hâlâ bir thread havuzundan bir işçi alır; eğer zincir çok uzunsa ve her adımda yeni bir thread çekilirse, context‑switch sayısı artar ve CPU‑cache tutarlılığı bozulur. Async/await’da ise aynı iş bir “task” içinde kalır, runtime gerektiğinde aynı thread’i yeniden kullanır; bu da genelde %5‑15 daha düşük latency ve daha az bellek tüketimi demek. Elbette, `TaskGroup` ya da `withTaskCancellationHandler` gibi üst seviye API’ler doğru kullanılmazsa gereksiz task spawn’u yapabilir, o zaman performans kaybı görülebilir. Yine de, doğru tasarım (örneğin I/O‑bound işleri `await`’le, CPU‑bound işleri `Task.detached` ile) yapıldığında kaynak yönetimi completion‑handler’dan çok daha temiz olur. Yeni başlayanların bu yapıyı benimsemesi için iki adım öneririm: 1️⃣ Xcode 14+ ve Swift 5.5+ sürümünü kurup, `async` fonksiyonlarıyla basit bir ağ isteği (`URLSession.shared.data(for:)`) deneyin; hata yönetimini `do‑try‑catch` içinde görmek, closure‑ların “error propagation” sorununu nasıl çözdüğünü hemen hissettirir. 2️⃣ Ardından `Actor` ve `TaskGroup` konseptlerini öğrenip, birden fazla paralel işin senkronizasyonunu test edin. Küçük bir prototipte async/await’ı tamamen kullanınca kodun okunabilirliği bir bakıma %30‑40 artar; aynı zamanda test edilebilirlik de yükselir çünkü fonksiyonlar artık bağımsız ve deterministic. Bence uzun vadede async/await, kod tabanının sürdürülebilirliğine ciddi bir ivme kazandırıyor. Hata akışı lineer, stack trace temiz, ve refactor yaparken “callback zinciri”ni kırıp tek bir fonksiyon haline getirmek çok daha az riskli. Tabii ki, mevcut büyük bir projeyi bir anda tüm handler’lardan dönüştürmek pratik olmayabilir; ama yeni modüllerde ya da kritik performans bottleneck’lerinde adım adım geçiş yapmak, kanka, gelecekteki bakım maliyetlerini büyük ölçüde düşürür. Valla, bir kez alışınca geri dönmek zor olur.