NSOperationQueue for komplekse oppgaver
Utforsk NSOperation og NSOperationQueue for en mer strukturert og håndterbar kjøring av samtidige oppgaver, inkludert avhengigheter.
NSOperationQueue for komplekse oppgaver er en gratis leksjon i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper inneholder totalt 4 leksjoner.
Hvorfor NSOperationQueue?
Du har lært om Grand Central Dispatch (GCD) for samtidige oppgaver. Selv om GCD er kraftig, kan det bli komplisert ved mer avansert oppgavehåndtering.
NSOperationQueue tilbyr en abstraksjon på høyere nivå, basert på objektorientering, for håndtering av samtidighet. Det bygger på GCD og gir mer kontroll og funksjoner som avhengigheter, avbryting og tilstandshåndtering.
Hva er NSOperation?
NSOperationQueue bygger på NSOperation. Dette er en abstrakt klasse som representerer én arbeidsenhet som kan kjøres samtidig med andre oppgaver.
Du oppretter ikke en forekomst av NSOperation direkte. I stedet bruker du de konkrete underklassene eller lager dine egne underklasser for å definere bestemte oppgaver.
- Innkapsler arbeid: Hver operasjon er en selvstendig oppgave.
- Håndterer tilstand: Operasjoner har tilstander som "ready", "executing" og "finished".
- Støtter avhengigheter: Operasjoner kan være avhengige av at andre operasjoner fullføres først.
Bygg din egen operasjon
For å opprette en tilpasset operasjon lager du en underklasse av NSOperation og overstyrer metoden main. Det er her logikken for oppgaven skal være.
Husk å merke operasjonen som "finished" når den er ferdig, spesielt for asynkrone operasjoner. For synkrone operasjoner håndteres dette av main.
Prøv å kjøre denne enkle, tilpassede operasjonen:
#import <Foundation/Foundation.h>
// CustomOperation.h
@interface CustomOperation : NSOperation
@end
// CustomOperation.m
@implementation CustomOperation
- (void)main {
if (self.isCancelled) {
return; // Always check for cancellation
}
NSLog(@"Custom operation started!");
// Simulate some work
[NSThread sleepForTimeInterval:1.0];
NSLog(@"Custom operation finished!");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
CustomOperation *op = [[CustomOperation alloc] init];
[op start]; // Manually start for demo
}
return 0;
}Enkle oppgaver med BlockOperation
For enklere oppgaver som ikke krever en tilpasset underklasse, er NSBlockOperation perfekt. Den lar deg pakke inn én eller flere kodeblokker som en operasjon.
Dette brukes ofte til raske engangsoppgaver uten belastningen ved å opprette en ny klasse.
Slik bruker du den:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Block operation running!");
[NSThread sleepForTimeInterval:0.5];
NSLog(@"Block operation done!");
}];
[blockOp start]; // Manually start for demo
}
return 0;
}Kjøre oppgaver med NSOperationQueue
For å utnytte samtidighet fullt ut legger du operasjoner til en NSOperationQueue. Køen administrerer kjøringen av operasjonene, ofte samtidig.
Køen avgjør når operasjonene skal starte, basert på om de er klare og på avhengighetene deres. Den håndterer trådene for deg.
Se hvordan begge operasjonene kjører samtidig:
#import <Foundation/Foundation.h>
@interface CustomOperation : NSOperation
@end
@implementation CustomOperation
- (void)main {
if (self.isCancelled) return;
NSLog(@"Custom operation started!");
[NSThread sleepForTimeInterval:1.0];
NSLog(@"Custom operation finished!");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
CustomOperation *op1 = [[CustomOperation alloc] init];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Block operation started!");
[NSThread sleepForTimeInterval:0.5];
NSLog(@"Block operation finished!");
}];
[queue addOperation:op1];
[queue addOperation:op2];
// Wait for all operations to complete
[queue waitUntilAllOperationsAreFinished];
NSLog(@"All operations completed!");
}
return 0;
}Kjeding av oppgaver med avhengigheter
En av de kraftigste funksjonene i NSOperation er muligheten til å angi avhengigheter. En operasjon kan konfigureres slik at den bare starter etter at en bestemt annen operasjon (eller et sett med operasjoner) er ferdig.
Dette er avgjørende for oppgaver som må utføres i en bestemt rekkefølge, slik at datakonsistens eller riktig arbeidsflyt sikres.
Legg merke til hvordan «Op B» venter på «Op A»:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *opA = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Operation A running...");
[NSThread sleepForTimeInterval:1.0];
NSLog(@"Operation A done!");
}];
NSBlockOperation *opB = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Operation B running...");
[NSThread sleepForTimeInterval:0.5];
NSLog(@"Operation B done!");
}];
// Op B depends on Op A
[opB addDependency:opA];
[queue addOperation:opA];
[queue addOperation:opB];
[queue waitUntilAllOperationsAreFinished];
NSLog(@"All dependent operations completed!");
}
return 0;
}Stoppe oppgaver på en kontrollert måte
Operasjoner kan avbrytes, noe som er viktig når brukeren ber om å stoppe dem, eller når en oppgave ikke lenger er relevant.
Når en operasjon avbrytes, blir egenskapen isCancelled satt til YES. main-metoden (eller blokken) bør kontrollere denne egenskapen regelmessig og avslutte på en kontrollert måte hvis den er sann.
En operasjon som allerede har startet, kan fortsatt fullføre noe arbeid før den kontrollerer isCancelled.
#import <Foundation/Foundation.h>
@interface CancellableOperation : NSOperation
@end
@implementation CancellableOperation
- (void)main {
for (int i = 0; i < 5; i++) {
if (self.isCancelled) {
NSLog(@"Operation was cancelled early!");
return;
}
NSLog(@"Working... %d", i);
[NSThread sleepForTimeInterval:0.2];
}
NSLog(@"Operation finished normally.");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
CancellableOperation *op = [[CancellableOperation alloc] init];
[queue addOperation:op];
// Wait a short time then try to cancel
[NSThread sleepForTimeInterval:0.3];
[op cancel];
NSLog(@"Attempted to cancel operation.");
[queue waitUntilAllOperationsAreFinished];
NSLog(@"Queue finished.");
}
return 0;
}Handlinger etter kjøring
Noen ganger må du utføre en handling først etter at en operasjon er ferdig, uavhengig av om den ble fullført eller avbrutt.
Alle NSOperation-objekter har egenskapen completionBlock. Denne blokken kjøres på en vilkårlig tråd når operasjonens main-metode (eller blokkene for NSBlockOperation) er ferdig.
Bruk den til opprydding eller til å oppdatere brukergrensesnittet (husk å sende oppdateringer av brukergrensesnittet til hovedtråden!).
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Operation running...");
[NSThread sleepForTimeInterval:0.5];
}];
op.completionBlock = ^{
NSLog(@"Operation completion block executed!");
// If updating UI, dispatch to main thread:
// dispatch_async(dispatch_get_main_queue(), ^{ /* UI update */ });
};
[queue addOperation:op];
[queue waitUntilAllOperationsAreFinished];
NSLog(@"All done!");
}
return 0;
}Administrere parallellitet
En NSOperationQueue kan kjøre flere operasjoner samtidig. Du kan styre denne atferden ved hjelp av egenskapen maxConcurrentOperationCount.
1: Operasjonene kjører serielt (én om gangen).NSOperationQueueDefaultMaxConcurrentOperationCount(vanligvis -1): Køen avgjør det optimale antallet basert på systemforholdene.- Ethvert positivt heltall: Begrenser antallet operasjoner som kjører samtidig.
Dette bidrar til å forhindre at ressursene tømmes, og til å håndtere arbeidsmengden.
Test forståelsen
Test kunnskapene dine om NSOperation og NSOperationQueue.
Oppsummering av NSOperationQueue
Godt jobbet! Du har utforsket NSOperation og NSOperationQueue.
- NSOperation representerer én enkelt arbeidsenhet.
- NSOperationQueue administrerer kjøringen av operasjoner og tilbyr et abstraksjonsnivå over GCD.
- Viktige funksjoner omfatter avhengigheter, avbryting, fullføringsblokker og kontroll over samtidighet.
- Bruk
NSBlockOperationtil enkle oppgaver og egendefinerte underklasser til komplekse, gjenbrukbare operasjoner.
Dette kraftige rammeverket hjelper deg med å bygge robuste og håndterbare samtidige applikasjoner.
Lær deg Objective-C med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 12
- Leksjoner
- 48
Ofte stilte spørsmål
Er leksjonen «NSOperationQueue for komplekse oppgaver» gratis?
Ja – hele teksten i «NSOperationQueue for komplekse oppgaver» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper inneholder totalt 4 leksjoner.
Hva lærer jeg i «NSOperationQueue for komplekse oppgaver»?
Utforsk NSOperation og NSOperationQueue for en mer strukturert og håndterbar kjøring av samtidige oppgaver, inkludert avhengigheter. Du øver på Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper?
Ingen tidligere erfaring er nødvendig. Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «NSOperationQueue for komplekse oppgaver»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-leksjonen?
Ja. Alle Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- NSURLSession for API-kall
- Grand Central Dispatch (GCD)
- NSOperationQueue for komplekse oppgaver
- Parse JSON med NSJSONSerialization