iOS-də əsas axını yükləmək tövsiyə edilmir və bunu necə qarşısını almaq olar?
sobes.tech Süni İntellekt
AI-dan cavab
Əsas axın istifadəçi interfeysinin yenilənməsindən və UI hadisələrinin idarə olunmasından məsuldur. Əsas axında hər hansı uzunmüddətli əməliyyatlar (şəbəkə sorğuları, ağır hesablamalar, fayllarla işləmə) onu bloklayacaq və bu, "donmuş" UI, aşağı cavabdehlik və hətta onun çökməsinə (watchdog timeout) səbəb olacaq.
Əsas axına yükü azaltmaq üçün yollar:
-
Grand Central Dispatch (GCD): Tapşırıqları arxa plan növbələrində asinxron icra etməyə imkan verir.
DispatchQueue.global(): Müxtəlif prioritetlərə malik qlobal arxa plan növbələrinə çıxış.DispatchQueue.main: UI-ni yeniləmək üçün əsas növbə.async { ... }: Kod blokunu asinxron icra edir.
// ağır tapşırığı arxa planda icra etmək DispatchQueue.global(qos: .userInitiated).async { // ağır hesablamalar və ya şəbəkə sorğusu // UI-ni əsas axında yeniləmək DispatchQueue.main.async { // istifadəçi interfeysini yeniləyin } } -
Əməliyyat Növbələri (Operation & OperationQueue): GCD növbələri üzərində daha yüksək səviyyəli abstraksiya, asılılıqları, ləğv və dayandırmanı dəstəkləyir.
OperationQueue(): Əməliyyat növbəsinin yaradılması.Operation: növəyə əlavə edilə bilən tapşırıqlar üçün abstrakt sinif.addOperation(_:): əməliyyatı növbəyə əlavə edir.
let downloadOperation = BlockOperation { // məlumatları yüklə } let parseOperation = BlockOperation { // məlumatları təhlil et } // asılılıq: təhlil yükləmədən sonra başlayır parseOperation.addDependency(downloadOperation) let queue = OperationQueue() queue.addOperation(downloadOperation) queue.addOperation(parseOperation) -
Əlaqə (async/await): Swift-də müasir asinxron proqramlaşdırma yanaşması.
async: funksiyanı asinxron olaraq işarələyir.await: asinxron əməliyyatın tamamlanmasını gözləyir.Task: yeni mübarizə tapşırığı yaradır.
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() // məlumatları işləyin // UI-ni avtomatik əsas axında yeniləyin // (Əgər Task əsas Actor və ya DispatchQueue.main-də yaradılırsa) } catch { // xətanı işləyin } } } -
Aktörlər: Müxtəlif mübarizə kontekstlərindən giriş zamanı yarış şəraitlərini qarşısını alır, öz vəziyyətinə eksklüziv giriş təmin edir.
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, Əməliyyat Növbələri və Concurrency arasındakı seçim tapşırığın mürəkkəbliyinə, lazım olan nəzarət səviyyəsinə və kodun strukturlaşdırma tələblərinə bağlıdır. Concurrency müasir tətbiqlərdə oxunabilirlik və təhlükəsizlik üçün üstünlük verilən yanaşmadır.