Sobes.tech
Principal

Miért nem működik a jelenlegi kód a mainben lévő végtelen for ciklussal? Hogyan javítható?

sobes.tech MI

Válasz az MI-től

Ha az iOS alkalmazás main függvényében végtelen for ciklus van, az alkalmazás nem működik, mert a fő szálat ez a ciklus blokkolja, és nem tudja feldolgozni a UI eseményeket és a rendszerüzeneteket.

Az iOS-ben a fő eseményciklus (run loop) a rendszer által van kezelve, és a fő szál blokkolása a felület lefagyásához vezet.

A helyzet javítása érdekében el kell távolítani a végtelen ciklust a main-ből, és engedni kell a rendszernek, hogy kezelje az eseményciklust. Ha ismétlődő feladatokat kell végrehajtani, akkor jobb timereket (Timer), háttérsorokat (DispatchQueue) vagy más aszinkron mechanizmusokat használni.

Hibás kód példa:

func main() {
    for { // végtelen ciklus
        // valami csinálunk
    }
}

Helyes megközelítés:

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
            // ismétlődő feladat
        }
        return true
    }
}

Így nem blokkoljuk a fő szálat, és a rendszer mechanizmusait használjuk az ismétlődő műveletekhez.