Чаро бор кардани ҷараёни асосӣ дар iOS тавсия дода намешавад ва чӣ роҳҳо барои пешгирӣ кардани он вуҷуд доранд?
sobes.tech AI
Ҷавоб аз AI
Потоки асосӣ масъуланд барои навсозии интерфейси корбар ва коркарди ҳодисаҳои UI. Ҳар гуна амали дарозмуддат (пурсишҳои шабакавӣ, ҳисобҳои вазнин, кор бо файлҳо) дар потоки асосӣ онҳоро банд мекунад, ки ба UI-и "хунук", ҷавобгӯии пасти барнома ва ҳатто кати он (watchdog timeout) оварда мерасонад.
Роҳҳои пешгирӣ кардани бор дар потоки асосӣ:
-
Grand Central Dispatch (GCD): Имкон медиҳад иҷрои асинхронӣ дар қаторҳои пасзамина.
DispatchQueue.global(): Дастрасӣ ба қаторҳои глобалии пасзамина бо афзалиятҳои гуногун.DispatchQueue.main: Қатори асосӣ барои навсозии UI.async { ... }: Иҷрои блоки код асинхронӣ.
// иҷрои вазифаи вазнин дар қатори пасзамина DispatchQueue.global(qos: .userInitiated).async { // ҳисобҳои вазнин ё дархости шабакавӣ // навсозии UI дар потоки асосӣ DispatchQueue.main.async { // навсозии интерфейси корбар } } -
Operation Queues (Operation & OperationQueue): Абстраксияи сатҳи баландтар аз қаторҳои GCD, ки ба ҳамдигар вобастагиро, бекор кардан ва боздошти онҳоро дастгирӣ мекунад.
OperationQueue(): Эҷоди қатори амалиётҳо.Operation: Класи абстрактӣ барои вазифаҳое, ки метавонанд ба қатор илова шаванд.addOperation(_:): Илова кардани амалиёт ба қатор.
let downloadOperation = BlockOperation { // зеркашии маълумот } let parseOperation = BlockOperation { // таҳлили маълумот } // вобастагӣ: таҳлил пас аз зеркашӣ оғоз мешавад parseOperation.addDependency(downloadOperation) let queue = OperationQueue() queue.addOperation(downloadOperation) queue.addOperation(parseOperation) -
Concurrency (async/await): Рӯйхати муосир дар Swift барои барномасозии асинхронӣ.
async: нишон медиҳад, ки функсия асинхронӣ аст.await: интизор мешавад, ки амали асинхронӣ ба анҷом расад.Task: эҷоди вазифаи рақобатӣ нав.
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() // коркарди маълумот // навсозии UI дар потоки асосӣ автоматӣ // (агар Task дар Actor ё DispatchQueue.main эҷод шавад) } catch { // коркарди хато } } } -
Actors: Пешгирӣ аз рақобати маълумот дар дастрасӣ аз контекстҳои рақобатӣ, таъмин кардани дастрасии эксклюзив ба ҳолати худ.
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, Operation Queues ва Concurrency вобаста ба мураккабии вазифа, сатҳи назорат ва талабот ба сохтори коди шумо мебошад. Concurrency дар барномаҳои муосир ба сабки хондан ва бехатарӣ афзалият дода мешавад.