Sobes.tech
Principal

Kodėl dabartinis kodas su begaline for ciklu main neveikia? Kaip tai ištaisyti?

sobes.tech AI

Atsakymas iš AI

Jei main funkcijoje iOS programoje yra begalinė for kilpa, programa neveiks, nes pagrindinis srautas yra užblokuotas šios kilpos ir negali apdoroti UI įvykių bei sisteminių pranešimų.

iOS pagrindinis įvykių ciklas (run loop) yra valdomas sistemos, ir jo užblokavimas sukelia sąsajos užšalimą.

Norint išspręsti situaciją, reikia pašalinti begalinę kilpą iš main ir leisti sistemai valdyti įvykių ciklą. Jei reikia atlikti pasikartojančius darbus, geriau naudoti laikmačius (Timer), foninius eilės (DispatchQueue) ar kitus asinchroninius mechanizmus.

Netinkamas kodo pavyzdys:

func main() {
    for { // begalinė kilpa
        // kažką darome
    }
}

Tinkamas požiūris:

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
            // pasikartojantis darbas
        }
        return true
    }
}

Šiuo būdu mes neblokuojame pagrindinio srauto ir naudojame sistemos mechanizmus pasikartojantiems veiksmams.