iOS'ta ana akışı aşırı yüklenmemesi neden önerilmez ve bunu önlemenin yolları nelerdir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Ana akış, kullanıcı arayüzünü güncellemek ve UI olaylarını işlemekle ilgilidir. Ana akışta herhangi bir uzun süren işlem (ağ istekleri, ağır hesaplamalar, dosya işlemleri) onu engelleyecek ve bu da "donmuş" bir UI, düşük uygulama yanıtı ve hatta çökmesine (watchdog zaman aşımı) neden olacaktır.
Ana akış üzerindeki yükü önlemenin yolları:
-
Grand Central Dispatch (GCD): Görevleri arka plan kuyruklarında asenkron olarak yürütmeye olanak tanır.
DispatchQueue.global(): Farklı önceliklere sahip küresel arka plan kuyruklarına erişim.DispatchQueue.main: UI güncellemeleri için ana kuyruk.async { ... }: Kod bloğunu asenkron olarak yürütür.
// Ağır bir görevi arka planda yürütme DispatchQueue.global(qos: .userInitiated).async { // ağır hesaplamalar veya ağ isteği // UI'yi ana akışta güncelle DispatchQueue.main.async { // kullanıcı arayüzünü güncelle } } -
İşlem Kuyrukları (Operation & OperationQueue): GCD kuyrukları üzerinde daha yüksek seviyeli soyutlama, bağımlılıkları, iptal ve duraklatmayı destekler.
OperationQueue(): Bir işlem kuyruğu oluşturma.Operation: Kuyruğa eklenebilecek görevler için soyut sınıf.addOperation(_:): İşlem ekleme.
let downloadOperation = BlockOperation { // veri indir } let parseOperation = BlockOperation { // veriyi ayrıştır } // bağımlılık: ayrıştırma, indirmeden sonra başlar parseOperation.addDependency(downloadOperation) let queue = OperationQueue() queue.addOperation(downloadOperation) queue.addOperation(parseOperation) -
Eşzamanlılık (async/await): Swift'te modern asenkron programlama yaklaşımı.
async: Bir fonksiyonu asenkron olarak işaretler.await: Asenkron bir işlemin tamamlanmasını bekler.Task: Yeni bir eşzamanlı görev oluşturur.
func fetchData() async throws -> Data { let url = URL(string: "https://example.com/data")! let (data, _) = try await URLSession.shared.data(from: url) return data } func updateUI() { Task { do { let data = try await fetchData() // veriyi işle // UI'yi ana akışta otomatik güncelle // (Eğer Task, ana aktör veya DispatchQueue.main içinde oluşturulursa) } catch { // hatayı işle } } } -
Aktörler: Farklı eşzamanlı bağlamlardan erişimde yarış koşullarını önler, durumuna özel erişimi sağlar.
actor DataStore { private var data: [String] = [] func addData(_ item: String) { data.append(item) } func getData() -> [String] { return data } } let store = DataStore() Task { await store.addData("item1") }
GCD, İşlem Kuyrukları ve Eşzamanlılık arasındaki seçim, görevin karmaşıklığına, gereken kontrol seviyesine ve kodun yapılandırma gereksinimlerine bağlıdır. Eşzamanlılık, okunabilirlik ve güvenlik nedeniyle modern uygulamalarda tercih edilen yaklaşımdır.