Junior
Əsas (əsas) olmayan axınlarla işləmək nədir?
sobes.tech Süni İntellekt
AI-dan cavab
iOS-da əsas (main thread)-dən fərqli axınlarla işləmək, istifadəçi interfeysinin əsas axını bloklamadan, asinxron tapşırıqları yerinə yetirməyə imkan verir. Bu, xüsusən, şəbəkə sorğuları, məlumatların emalı və ya fayllarla işləmə kimi uzunmüddətli əməliyyatların yerinə yetirilməsində tətbiqin cavabvermə qabiliyyətini qorumaq üçün çox vacibdir.
Əsas mexanizmlər aşağıdakılardır:
-
GCD (Grand Central Dispatch):
- Aşağı səviyyəli C-əsaslı kitabxana.
- Tapşırıq növbələrindən (
DispatchQueue) istifadə edir. - Paralel və ardıcıl növbələr yarada bilər.
- Qlobal (konkurrent) və əsas axın (
main) üçün növbələrlə işləyir. - Kod bloklarını fon rejimində yerinə yetirmək üçün asandır.
// Qlobal növbədə kod icrası DispatchQueue.global(qos: .userInitiated).async { // Uzunmüddətli tapşırıq print("Tapşırıq fon axınında yerinə yetirildi") // UI yeniləmək üçün əsas axına qayıt DispatchQueue.main.async { // UI-ni yeniləyin print("UI əsas axında yeniləndi") } } -
Operation Queues (Operation və OperationQueue):
- GCD-ə əsaslanan daha yüksək səviyyəli abstraksiya.
- Tapşırıqları
Operationobyektləri kimi təqdim edir. - Əlaqədar əməliyyatlar arasında asılılıqları idarə etmək, dayandırmaq, ləğv etmək və yenidən başlamaq imkanı verir.
- Çətin tapşırıq zəncirlərini idarə etmək üçün daha əlverişlidir.
import Foundation class MyOperation: Operation { override func main() { if self.isCancelled { return } // Uzunmüddətli tapşırıq print("Əməliyyat fon axınında yerinə yetirildi") if self.isCancelled { return } // UI yeniləmək üçün əsas axına əlavə et OperationQueue.main.addOperation { print("UI əməliyyatdan yeniləndi") } } } // Əməliyyat növbəsini yaradın let queue = OperationQueue() queue.qualityOfService = .userInitiated // Əməliyyatları növbəyə əlavə edin queue.addOperation(MyOperation()) -
Async/Await (Concurrency):
- Müasir Swift üçün asinxron proqramlaşdırma mexanizmi.
asyncaçar sözündən istifadə edərək, asinxron funksiyaları işarələyir vəawaitilə onların tamamlanmasını gözləyir.- Asinxron kodun yazılmasını və oxunmasını sadələşdirir, "callback hell"-dən qaçınır.
- Avtomatik olaraq axınlar arasında keçidi idarə edir.
func fetchData() async -> Data? { // Şəbəkə sorğusunu təqlid edir try? await Task.sleep(nanoseconds: 1_000_000_000) print("Məlumatlar asinxron funksiyada alındı") return Data() } // Asinxron funksiyanı Task-dən çağırmaq Task { if let data = await fetchData() { print("Məlumatların ölçüsü: \(data.count)") // Avtomatik olaraq uyğun kontekstdə yerinə yetirilir (UI yeniləmək üçün main ola bilər) } }
Vacib aspektlər:
- Thread Safety: Ümumi resurslara (dəyişənlər, obyektlər) müxtəlif axınlardan girişdə ehtiyatlı olun, məlumat yarışlarını (data races) qarşısını alın. Bloklamalar (locks), növbələr (serialləşdirmə üçün) və ya atomar əməliyyatlar istifadə olunur.
- UI yeniləmək: UI elementlərini yalnız əsas axında (
DispatchQueue.mainvə yaOperationQueue.main) yeniləyin. Fon axınından UI yeniləməyə cəhd etmək səhvlərə və ya qeyri-müəyyən davranışlara səbəb olar. - Optimizasiya: Tapşırığa uyğun mexanizmi seçin. GCD sadə asinxron bloklar üçün, Operation Queues mürəkkəb zəncirləri idarə etmək üçün, Async/Await isə müasir strukturlaşdırılmış asinxron kod üçün əlverişlidir.
- Prioritetlər (QoS): Tapşırıqlar üçün xidmət keyfiyyətini (Quality of Service) göstərin ki, sistem onları düzgün idarə edə və resursları bölüşdürə bilsin.
| Mexanizm | Abstraksiya səviyyəsi | Asılılıqları idarəetmə | Ləğv/Dayandırma | İstifadə rahatlığı |
|---|---|---|---|---|
| GCD | Aşağı | Yox (yalnız əsas) | Çətin | Orta |
| Operation Queues | Yüksək | Bəli | Asan | Orta/Yüksək |
| Async/Await | Yüksək | Qismən daxili | Asan (Task) | Yüksək |
Fon axınlarının düzgün istifadəsi, iOS tətbiqlərinin səmərəli və cavab verən olmasını təmin etmək üçün çox vacibdir.