NSOperationQueue til komplekse opgaver
Udforsk NSOperation og NSOperationQueue til mere struktureret og håndterbar samtidig udførelse af opgaver, herunder afhængigheder.
NSOperationQueue til komplekse opgaver er en gratis Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektion på CoddyKit. Dette er lektion 3 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.
Hvorfor NSOperationQueue?
Du har lært om Grand Central Dispatch (GCD) til samtidige opgaver. Selvom GCD er effektiv, kan den blive kompleks ved indviklet opgavestyring.
NSOperationQueue tilbyder en objektorienteret tilgang på højere niveau til håndtering af samtidighed. Den bygger oven på GCD og giver mere kontrol samt funktioner som afhængigheder, annullering og tilstandshåndtering.
Hvad er NSOperation?
Kernen i NSOperationQueue er NSOperation. Det er en abstrakt klasse, der repræsenterer en enkelt arbejdsenhed, som kan udføres samtidigt.
Du opretter ikke NSOperation direkte. I stedet bruger du dens konkrete underklasser eller opretter dine egne brugerdefinerede underklasser for at definere bestemte opgaver.
- Indkapsler arbejde: Hver operation er en selvstændig opgave.
- Håndterer tilstand: Operationer har tilstande som "klar", "udføres" og "færdig".
- Understøtter afhængigheder: Operationer kan afhænge af, at andre bliver færdige først.
Byg din egen operation
Hvis du vil oprette en brugerdefineret operation, skal du oprette en underklasse af NSOperation og tilsidesætte dens main-metode. Det er her, logikken for din opgave skal være.
Husk at markere din operation som "færdig", når den er afsluttet, især for asynkrone operationer. For synkrone operationer håndterer main dette.
Prøv at køre denne simple brugerdefinerede operation:
#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;
}Simple opgaver med BlockOperation
Til simple opgaver, der ikke kræver en brugerdefineret underklasse, er NSBlockOperation perfekt. Den lader dig indpakke én eller flere kodeblokke som en operation.
Den bruges ofte til hurtige enkeltstående opgaver uden arbejdet med at oprette en ny klasse.
Sådan bruger 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;
}Udfør med NSOperationQueue
For virkelig at udnytte samtidighed tilføjer du operationer til en NSOperationQueue. Køen administrerer udførelsen af operationerne, ofte samtidigt.
Køen afgør, hvornår operationerne skal starte, baseret på deres parathed og afhængigheder. Den håndterer trådningen for dig.
Se, hvordan begge operationer kører samtidigt:
#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;
}Kædning af opgaver med afhængigheder
En af NSOperations mest kraftfulde funktioner er at angive afhængigheder. En operation kan konfigureres til først at starte, når en anden bestemt operation eller et sæt af operationer er afsluttet.
Det er afgørende for opgaver, der skal udføres i en bestemt rækkefølge, så datakonsistens eller et korrekt arbejdsforløb sikres.
Bemærk, 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;
}Stop opgaver på en kontrolleret måde
Operationer kan annulleres, hvilket er vigtigt, når brugeren stopper dem, eller når en opgave ikke længere er relevant.
Når en operation annulleres, bliver dens egenskab isCancelled til YES. Din main-metode (eller blok) bør regelmæssigt kontrollere denne egenskab og afslutte på en kontrolleret måde, hvis den er sand.
En operation, der allerede er startet, kan stadig nå at udføre noget arbejde, 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 efter udførelse
Nogle gange skal du udføre en handling, først efter at en operation er afsluttet, uanset om den lykkedes eller blev annulleret.
Alle NSOperation-objekter har egenskaben completionBlock. Denne blok udføres på en vilkårlig tråd, når operationens main-metode (eller blokkene for NSBlockOperation) er afsluttet.
Brug den til oprydning eller til at opdatere brugergrænsefladen (husk at sende opdateringer af brugergrænsefladen 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;
}Håndtering af parallelitet
En NSOperationQueue kan udføre flere operationer samtidigt. Du kan styre denne adfærd ved hjælp af egenskaben maxConcurrentOperationCount.
1: Operationerne kører sekventielt (én ad gangen).NSOperationQueueDefaultMaxConcurrentOperationCount(normalt -1): Køen afgør det optimale antal ud fra systemets tilstand.- Ethvert positivt heltal: Begrænser antallet af operationer, der kører samtidigt.
Det hjælper med at forhindre, at ressourcerne slipper op, og med at styre arbejdsbelastningen.
Test din forståelse
Test din viden om NSOperation og NSOperationQueue.
Opsummering af NSOperationQueue
Godt klaret! Du har udforsket NSOperation og NSOperationQueue.
- NSOperation repræsenterer en enkelt arbejdsenhed.
- NSOperationQueue administrerer udførelsen af operationer og giver en abstraktion på højere niveau end GCD.
- De vigtigste funktioner omfatter afhængigheder, annullering, afslutningsblokke og styring af samtidighed.
- Brug
NSBlockOperationtil enkle opgaver og brugerdefinerede underklasser til komplekse, genanvendelige operationer.
Denne effektive ramme hjælper dig med at bygge robuste og håndterbare applikationer, der udfører arbejde samtidigt.
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 “NSOperationQueue til komplekse opgaver” gratis?
Ja — hele teksten til “NSOperationQueue til komplekse opgaver” 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 “NSOperationQueue til komplekse opgaver”?
Udforsk NSOperation og NSOperationQueue til mere struktureret og håndterbar samtidig udførelse af opgaver, herunder afhængigheder. 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 3 af 4.
Hvor lang tid tager lektionen “NSOperationQueue til komplekse opgaver”?
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
- NSURLSession til API-kald
- Grand Central Dispatch (GCD)
- NSOperationQueue til komplekse opgaver
- Parsing af JSON med NSJSONSerialization