Sobes.tech
Principal

Proč současný kód s nekonečnou smyčkou for v main nefunguje? Jak to opravit?

sobes.tech AI

Odpověď od AI

Pokud v main iOS aplikace je nekonečná smyčka for, aplikace nefunguje, protože hlavní vlákno je touto smyčkou zablokováno a nemůže zpracovávat události UI a systémové zprávy.

V iOS je hlavní smyčka událostí (run loop) řízena systémem a její zablokování způsobí zamrznutí rozhraní.

Chcete-li situaci opravit, je třeba odstranit nekonečnou smyčku z main a nechat systém řídit smyčku událostí. Pokud je třeba provádět opakující se úkoly, je lepší použít časovače (Timer), fronty na pozadí (DispatchQueue) nebo jiné asynchronní mechanismy.

Příklad nesprávného kódu:

func main() {
    for { // nekonečná smyčka
        // něco děláme
    }
}

Správný pří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 způsobem neblokujeme hlavní vlákno a používáme systémové mechanismy pro opakující se akce.