Sobes.tech
Junior

Чӣ тавр кор кардан бо ҷараёнҳои дигар аз ҷараёни асосӣ (main thread)?

sobes.tech AI

Ҷавоб аз AI

Коркар бо ҷараёнҳо, ки аз ҷараёни асосӣ (main thread) фарқ мекунанд, дар iOS имкон медиҳад, ки вазифаҳои асинхронӣ иҷро шаванд, бе бастани ҷараёни UI асосӣ. Ин барои нигоҳ доштани ҷавобгӯии барнома муҳим аст, махсусан дар иҷрои вазифаҳои дарозмуддат, мисли дархостҳои шабакавӣ, коркарди маълумот ё кор бо файлҳо.

Механизмҳои асосӣ барои кор бо ҷараёнҳои пасзамина иборатанд аз:

  1. GCD (Grand Central Dispatch):

    • Китобхонаи сатҳи поён барои C.
    • Истифодаи навбатҳо барои вазифаҳо (DispatchQueue).
    • Мумкинсозии сохтани навбатҳои параллелӣ ва пайдарпай.
    • Истифодаи навбатҳои глобалӣ (concurrent) ва навбати ҷараёни асосӣ (main).
    • Осон барои истифода барои иҷрои блокҳои код дар режимҳои пасзамина.
    // Иҷрои код дар навбати глобалӣ
    DispatchQueue.global(qos: .userInitiated).async {
        // Вазифаи дарозмуддат
        print("Вазифа дар ҷараёни пасзамина иҷро шуд")
    
        // Баргаштан ба ҷараёни асосӣ барои навсозии UI
        DispatchQueue.main.async {
            // Навсозии UI
            print("UI дар ҷараёни асосӣ навсозӣ шуд")
        }
    }
    
  2. Operation Queues (Operation ва OperationQueue):

    • Абстраксияи сатҳи баландтар, асос ёфта дар GCD.
    • Нақл кардани вазифаҳо ҳамчун объектҳои Operation.
    • Истифодаи идоракунии вобастагиҳо байни вазифаҳо, боздоштан, бекор кардан ва такмил додани онҳо.
    • Барои идоракунии сиклҳои мураккабтар қулай.
    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if self.isCancelled { return }
            // Вазифаи дарозмуддат
            print("Operation дар ҷараёни пасзамина иҷро шуд")
    
            if self.isCancelled { return }
            // Баргаштан ба ҷараёни асосӣ барои навсозии UI
            OperationQueue.main.addOperation {
                 print("UI навсозӣ шуд аз Operation")
            }
        }
    }
    
    // Сохтани навбат
    let queue = OperationQueue()
    queue.qualityOfService = .userInitiated
    
    // Илова кардани вазифаҳо
    queue.addOperation(MyOperation())
    
  3. Async/Await (Concurrency):

    • Механизми муосир барои барномасозии асинхронӣ дар Swift.
    • Истифодаи калимаҳои async барои нишон додани функсияҳои асинхронӣ ва await барои интизор шудан барои анҷоми онҳо.
    • Осон кардани навиштани ва хондани коди асинхронӣ, бо парҳез аз "callback hell".
    • Автоматӣ идоракунии гузариш байни ҷараёнҳоро.
    func fetchData() async -> Data? {
        // Имитацияи дархости шабакавӣ
        try? await Task.sleep(nanoseconds: 1_000_000_000)
        print("Маълумот дар функсияи асинхронӣ гирифта шуд")
        return Data()
    }
    
    // Даъват кардани функсияи асинхронӣ аз Task
    Task {
        if let data = await fetchData() {
            print("Маълумотҳои гирифташуда андозаи: \(data.count)")
            // Автоматӣ дар контексти мувофиқ иҷро мешавад (метавон main барои навсозии UI)
        }
    }
    

Масъалаҳои муҳим:

  • Бехатарии ҷараёнҳо (Thread Safety): Маҳз бояд ҳушёр буд дар дастрасӣ ба захираҳои умумӣ (променливҳо, объектҳо) аз ҷараёнҳои гуногун, то аз рӯи маълумотҳои рақобат набарем. Барои ин, истифода мешаванд блокирҳо (locks), навбатҳо (барои сериализатсия кардани дастрасӣ) ё амалҳои атомар.
  • Навсозии UI: Ҳамеша навсозии унсурҳои интерфейсро танҳо дар ҷараёни асосӣ иҷро кунед (DispatchQueue.main ё OperationQueue.main). Спреъи навсозии UI аз ҷараёни пасзамина метавонад ба хатоҳо ё рафторҳои номуайян оварда расонад.
  • Оптимизатсия: Механизми дурустро интихоб кунед, вобаста ба вазифа. GCD барои блокҳои оддӣ, Operation Queues — барои идоракунии сиклҳои мураккаб, Async/Await — барои коди муосир ва сохторӣ.
  • Приоритетҳо (QoS): сифати хизматрасониро барои вазифаҳо нишон диҳед, то система метавонад онҳоро дуруст идора кунад ва захираҳоро тақсим кунад.
Механизм Сатҳи абстраксия Идоракунии вобастагиҳо Бекор кардан/Пауза Осонии истифода
GCD Низо Надорад (фақат асосӣ) Кушодан душвор Миёна
Operation Queues Баланд Бале Осон Миёна/Баланд
Async/Await Баланд То андозае дарунсохт Осон (Task) Баланд

Истифодаи дуруст аз ҷараёнҳои пасзамина барои сохтани барномаҳои самаранок ва ҷавобгӯ дар iOS муҳим аст.