Sobes.tech
Middle

Неге iOS-та негизги агымды жүктөө сунушталбайт жана аны болтурбоо үчүн кандай жолдор бар?

sobes.tech AI

AIден жооп

Негізгі ағын пайдаланушы интерфейсін жаңарту және UI оқиғаларын өңдеу үшін жауап береді. Қандай да бір ұзақ операциялар (желілік сұраулар, ауыр есептеулер, файлдармен жұмыс) негізгі ағынға жүктелсе, ол «тоқтап» қалады, бұл қосымшаның төмен жауап беруіне және тіпті оның құлдырауына (watchdog timeout) әкелуі мүмкін.

Жүктемені негізгі ағыннан болдырмау жолдары:

  1. Grand Central Dispatch (GCD): Фондық кезектерде асинхронды тапсырмаларды орындауға мүмкіндік береді.

    • DispatchQueue.global(): Әр түрлі приоритеттері бар ғаламдық фондық кезектерді алу.
    • DispatchQueue.main: UI жаңартуға арналған негізгі кезек.
    • async { ... }: Код блогын асинхронды орындау.
    // ауыр тапсырманы фондық ағынға орындау
    DispatchQueue.global(qos: .userInitiated).async {
        // ауыр есептеулер немесе желілік сұрау
    
        // UI-ды негізгі ағында жаңарту
        DispatchQueue.main.async {
            // пайдаланушы интерфейсін жаңарту
        }
    }
    
  2. 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)
    
  3. 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 {
                // қателікті өңдеу
            }
        }
    }
    
  4. 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 қазіргі қолданбаларда оқылуы мен қауіпсіздігі үшін артықшылығы бар.