Sobes.tech
Principal

Prečo aktuálny kód s nekonečnou slučkou for v main ne funguje? Ako to opraviť?

sobes.tech AI

Odpoveď od AI

Ak v main iOS aplikácie je nekonečný cyklus for, aplikácia nefunguje, pretože hlavný vlákno je blokované týmto cyklom a nemôže spracovávať UI udalosti a systémové správy.

V iOS je hlavný cyklus udalostí (run loop) spravovaný systémom a jeho blokovanie spôsobí zamrznutie rozhrania.

Na opravu situácie je potrebné odstrániť nekonečný cyklus z main a nechať systém spravovať cyklus udalostí. Ak je potrebné vykonávať opakujúce sa úlohy, je lepšie použiť časovače (Timer), fronty na pozadí (DispatchQueue) alebo iné asynchrónne mechanizmy.

Príklad nesprávneho kódu:

func main() {
    for { // nekonečný cyklus
        // niečo robíme
    }
}

Správny prístup:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
            // periodická úloha
        }
        return true
    }
}

Týmto spôsobom neblokujeme hlavný vlákno a používame systémové mechanizmy na opakujúce sa akcie.