Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer · Lektion

Grand Central Dispatch (GCD)

Implementér samtidige operationer med Grand Central Dispatch for at forbedre applikationens responsivitet og ydeevne.

Lektion 2 af 411 trin

Grand Central Dispatch (GCD) er en gratis Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-kurset indeholder 4 lektioner i alt.

Hold apps responsive

Har du nogensinde brugt en app, der frøs under indlæsning af data? Det skyldes ofte, at den primære tråd blokeres.

Den primære tråd er dér, hvor alle opdateringer af brugerfladen og brugerinteraktioner foregår. Hvis du udfører en langvarig opgave dér, bliver din app ikke længere responsiv.

Samtidighed betyder, at flere opgaver tilsyneladende kører på samme tid. Det holder den primære tråd fri og sikrer en problemfri brugeroplevelse.

Mød GCD

Grand Central Dispatch (GCD) er Apples effektive API på lavt niveau til håndtering af samtidige operationer. Den er bygget oven på C og blokke og gør det nemt at udføre opgaver asynkront.

GCD hjælper dig med at køre kode samtidigt ved at administrere dispatch-køer. Du fortæller GCD, hvilke opgaver der skal køres, og den beslutter, hvornår og hvordan de skal udføres på de tilgængelige processorkerner.

Forstå dispatch-køer

GCD bruger dispatch-køer til at administrere opgaver. Tænk på en kø som en række opgaver, der venter på at blive udført.

  • Serielle køer: Opgaverne køres én ad gangen i den rækkefølge, de blev tilføjet. Hver seriel kø behandler sine opgaver sekventielt.
  • Samtidige køer: Opgaverne startes i den rækkefølge, de blev tilføjet, men kan køre på samme tid. Rækkefølgen, de afsluttes i, er ikke garanteret.

Brugerfladens bedste ven

Alle iOS-applikationer har en særlig seriel kø, der kaldes den primære dispatch-kø. Det er her, alle opdateringer af brugerfladen skal foregå.

Hvis du forsøger at opdatere brugerfladen fra en baggrundstråd, kan din app gå ned eller opføre sig uforudsigeligt. Skift altid tilbage til den primære kø ved ændringer af brugerfladen.

Du får adgang til den med dispatch_get_main_queue().

Systemets baggrundshjælpere

GCD stiller flere globale samtidige køer til rådighed, som du kan bruge til baggrundsopgaver. Disse køer administreres af systemet og er optimeret til ydeevne.

De adskiller sig ved deres Quality of Service-klasse (QoS), som angiver opgavernes prioritet:

  • .userInteractive: Relateret til brugerfladen, højeste prioritet.
  • .userInitiated: Opgaver, som brugeren har anmodet om.
  • .utility: Langvarige, ikke-hastende opgaver.
  • .background: Vedligeholdelse, laveste prioritet.

Gør baggrundsarbejde nemt

Den mest almindelige måde at bruge GCD på er med dispatch_async. Denne funktion tilføjer en opgave (en kodeblok) til en kø og returnerer med det samme, så den kaldende kode kan fortsætte sin udførelse.

Opgaven kører derefter på en separat tråd i baggrunden. Det er perfekt til operationer, der ikke behøver at blokere den primære tråd, f.eks. netværksforespørgsler eller krævende beregninger.

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSLog(@"1. Program starts.");

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      NSLog(@"3. Doing some background work...");
      [NSThread sleepForTimeInterval:1.0]; // Simulate work
      NSLog(@"4. Background work finished.");
    });

    NSLog(@"2. Program continues immediately after dispatch_async.");
    [NSThread sleepForTimeInterval:2.0]; // Keep main thread alive
  }
  return 0;
}

Vent på en opgave

Selvom dispatch_async er velegnet til ikke-blokerende operationer, har du nogle gange brug for at vente på, at en opgave bliver færdig, før du fortsætter. Det er her, dispatch_sync kommer ind i billedet.

dispatch_sync tilføjer en opgave til en kø og blokerer derefter den aktuelle tråd, indtil opgaven er færdig. Vær forsigtig: Kald aldrig dispatch_sync på den aktuelle kø, da det vil medføre en deadlock!

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSLog(@"1. Program starts.");

    dispatch_queue_t mySerialQueue = dispatch_queue_create("com.coddykit.myserialqueue", DISPATCH_QUEUE_SERIAL);

    dispatch_sync(mySerialQueue, ^{
      NSLog(@"2. This synchronous task runs now.");
      [NSThread sleepForTimeInterval:0.5];
    });

    NSLog(@"3. Program continues AFTER the synchronous task completes.");
  }
  return 0;
}

Problemfri opdatering af brugerfladen

Et almindeligt mønster i iOS-apps er at udføre en langvarig opgave i baggrunden og derefter opdatere brugerfladen, når den er færdig. Det forhindrer, at brugerfladen fryser.

Det gør du ved at sende baggrundsopgaven til en global samtidig kø og derefter sende opgaven med opdatering af brugerfladen til den primære kø.

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSLog(@"1. App starts, fetching data...");

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      NSLog(@"2. Performing heavy data fetch on background thread...");
      [NSThread sleepForTimeInterval:1.5]; // Simulate network call or heavy computation
      NSString *fetchedData = @"User Data Loaded!";

      dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"3. Data fetched! Updating UI on main thread: %@", fetchedData);
        // In a real app, you'd update a UILabel or UIImageView here.
      });
    });

    NSLog(@"4. App remains responsive while data fetches.");
    [NSThread sleepForTimeInterval:2.0]; // Keep main thread alive
  }
  return 0;
}

Planlæg opgaver til senere

Nogle gange har du brug for at planlægge, at en opgave skal køre efter en bestemt forsinkelse. GCD stiller dispatch_after til rådighed til dette formål.

Det er vigtigt at bemærke, at dispatch_after ikke er en timer i realtid. Den tilføjer blot en blok til den angivne kø efter en minimumsforsinkelse. Det præcise udførelsestidspunkt afhænger af køens aktivitet.

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSLog(@"1. Program starts.");
    NSTimeInterval delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));

    dispatch_after(popTime, dispatch_get_main_queue(), ^{
      NSLog(@"2. This message appears after 2 seconds.");
    });

    NSLog(@"3. Program continues immediately, waiting for delayed task.");
    [NSThread sleepForTimeInterval:3.0]; // Keep main thread alive
  }
  return 0;
}

GCD-tjek

Lad os teste din forståelse af GCD.

Opsummering af GCD

Godt gået! Du har lært det grundlæggende i Grand Central Dispatch.

  • GCD hjælper med at administrere samtidige opgaver, så din app forbliver responsiv.
  • Dispatch-køer (serielle og samtidige) styrer opgavernes udførelse.
  • Den primære kø bruges til opdateringer af brugerfladen og tilgås altid via dispatch_async.
  • Globale samtidige køer bruges til arbejde i baggrunden.
  • dispatch_async kører opgaver uden at blokere, mens dispatch_sync venter på opgaver.

Det er afgørende at blive fortrolig med GCD for at bygge iOS-applikationer med høj ydeevne, der forbliver responsive.

Gratis at komme i gang

Lær Objective-C med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Grand Central Dispatch (GCD)” gratis?

Ja — hele teksten til “Grand Central Dispatch (GCD)” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-kurset, skal du opgradere til CoddyKit PRO. Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Grand Central Dispatch (GCD)”?

Implementér samtidige operationer med Grand Central Dispatch for at forbedre applikationens responsivitet og ydeevne. Du øver dig i Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer?

Der kræves ingen tidligere erfaring. Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Grand Central Dispatch (GCD)”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektion?

Ja. Alle Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. NSURLSession til API-kald
  2. Grand Central Dispatch (GCD)
  3. NSOperationQueue til komplekse opgaver
  4. Parsing af JSON med NSJSONSerialization
← Tilbage til Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer