Swift Concurrency: async/await ile Modern Eşzamanlılık

Giriş Swift 5.5 ile birlikte gelen async/await, iOS geliştirme dünyasında callback ve completion handler cehenneminden kurtulmanın en temiz yolu haline geldi. Bu yazıda gerçek dünya senaryolarıyla Swift Concurrency’yi ele alacağız. Neden async/await? Klasik completion handler yaklaşımının sorunları: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // ❌ Eski yöntem — callback cehennemi func fetchUser(id: String, completion: @escaping (Result<User, Error>) -> Void) { networkService.get("/users/\(id)") { result in switch result { case .success(let data): do { let user = try JSONDecoder().decode(User.self, from: data) self.fetchPosts(for: user) { postsResult in // Bir kat daha içeriye... } } catch { completion(.failure(error)) } case .failure(let error): completion(.failure(error)) } } } 1 2 3 4 5 6 7 8 9 10 11 // ✅ async/await ile temiz kod func fetchUser(id: String) async throws -> User { let data = try await networkService.get("/users/\(id)") return try JSONDecoder().decode(User.self, from: data) } func loadUserWithPosts(id: String) async throws -> (User, [Post]) { let user = try await fetchUser(id: id) let posts = try await fetchPosts(for: user) return (user, posts) } Structured Concurrency ile Paralel İşlemler İki bağımsız network isteğini paralel yapmak için async let kullanın: ...

6 Haziran 2026 · 3 dk · Kemal Türk

SwiftUI'da TCA (The Composable Architecture) ile Ölçeklenebilir Mimari

TCA Nedir? The Composable Architecture (TCA), Brandon Williams ve Stephen Celis tarafından geliştirilen, SwiftUI için tasarlanmış bir uygulama mimarisidir. Unidirectional data flow prensibine dayanır ve test edilebilirliği birinci sınıf vatandaş olarak ele alır. Temel Kavramlar TCA’nın beş temel bileşeni vardır: Bileşen Görev State Ekranın tüm verisi Action Gerçekleşen olaylar Reducer State + Action → yeni State Store Runtime: state tutar, action gönderir Effect Yan etkiler (network, timer vb.) Basit Bir Örnek: Sayaç 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 import ComposableArchitecture import SwiftUI // 1. State struct CounterFeature: Reducer { struct State: Equatable { var count = 0 var isLoading = false } // 2. Action enum Action { case incrementTapped case decrementTapped case factButtonTapped case factResponse(String) } // 3. Reducer var body: some ReducerOf<Self> { Reduce { state, action in switch action { case .incrementTapped: state.count += 1 return .none case .decrementTapped: state.count -= 1 return .none case .factButtonTapped: state.isLoading = true return .run { [count = state.count] send in let fact = try await fetchFact(for: count) await send(.factResponse(fact)) } case let .factResponse(fact): state.isLoading = false // fact'ı state'e kaydet return .none } } } } View Katmanı 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 struct CounterView: View { let store: StoreOf<CounterFeature> var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(spacing: 20) { Text("\(viewStore.count)") .font(.largeTitle.bold()) HStack { Button("-") { viewStore.send(.decrementTapped) } .buttonStyle(.bordered) Button("+") { viewStore.send(.incrementTapped) } .buttonStyle(.borderedProminent) } if viewStore.isLoading { ProgressView() } else { Button("Fakt Al") { viewStore.send(.factButtonTapped) } } } } } } Test Yazımı TCA’nın en güçlü yanı test edilebilirlik: ...

5 Haziran 2026 · 3 dk · Kemal Türk

iOS Performans Optimizasyonu: Instruments ile Bottleneck Tespiti

Giriş Kullanıcılar düşük frame rate’e, yavaş açılış sürelerine ve yüksek bellek kullanımına karşı acımasızdır. Bu rehberde Xcode Instruments ile performans sorunlarını sistematik olarak nasıl bulacağınızı ve düzelteceğinizi göreceğiz. Instruments’a Giriş Instruments’ı açmak için: Xcode → Product → Profile (⌘I) Yaygın kullandığım template’ler: Time Profiler — CPU darboğazları Allocations — Bellek kullanımı ve leak’ler Core Animation — Frame drop’ları Network — Ağ isteklerinin analizi 1. Frame Drop’larını Tespit Etme Hedef: 60 FPS (16.67ms/frame) veya ProMotion için 120 FPS. ...

4 Haziran 2026 · 3 dk · Kemal Türk