NSOperationQueue monimutkaisiin tehtäviin
Tutustukaa NSOperationiin ja NSOperationQueueen rakenteisempaa ja hallittavampaa samanaikaisten tehtävien suoritusta varten, mukaan lukien riippuvuudet.
NSOperationQueue monimutkaisiin tehtäviin on ilmainen Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-kurssilla on yhteensä 4 oppituntia.
Miksi NSOperationQueue?
Olette oppineet käyttämään Grand Central Dispatchia (GCD) samanaikaisiin tehtäviin. Vaikka GCD on tehokas, sen käyttö voi muuttua monimutkaiseksi vaativassa tehtävienhallinnassa.
NSOperationQueue tarjoaa korkeamman tason oliopohjaisen tavan käsitellä samanaikaisuutta. Se rakentuu GCD:n päälle ja tarjoaa enemmän hallintaa sekä ominaisuuksia, kuten riippuvuudet, peruutuksen ja tilanhallinnan.
Mikä on NSOperation?
NSOperationQueue-luokan ytimessä on NSOperation. Se on abstrakti luokka, joka edustaa yhtä samanaikaisesti suoritettavaa työyksikköä.
NSOperation-luokasta ei luoda ilmentymää suoraan. Sen sijaan käytätte sen konkreettisia aliluokkia tai luotte omia mukautettuja aliluokkia tiettyjen tehtävien määrittämistä varten.
- Kapseloi työn: Kukin operaatio on itsenäinen tehtävä.
- Hallitsee tilaa: Operaatioilla on tiloja, kuten "ready", "executing" ja "finished".
- Tukee riippuvuuksia: Operaation suorittaminen voi edellyttää muiden operaatioiden valmistumista ensin.
Oman operaation rakentaminen
Voitte luoda mukautetun operaation perimällä NSOperation-luokan ja korvaamalla sen main-metodin. Tehtävän logiikka sijoitetaan tähän metodiin.
Muistakaa merkitä operaatio tilaan "finished", kun se on valmis, erityisesti asynkronisten operaatioiden yhteydessä. Synkronisissa operaatioissa main huolehtii tästä.
Kokeilkaa suorittaa tämä yksinkertainen mukautettu operaatio:
#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;
}Yksinkertaiset tehtävät BlockOperationilla
Yksinkertaisiin tehtäviin, jotka eivät vaadi mukautettua aliluokkaa, NSBlockOperation sopii erinomaisesti. Sen avulla voitte kääriä yhden tai useamman koodilohkon operaatioksi.
Tätä käytetään usein nopeisiin, kertaluonteisiin tehtäviin ilman uuden luokan luomisen aiheuttamaa ylimääräistä työtä.
Näin käytätte sitä:
#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;
}Suorittaminen NSOperationQueuen avulla
Jotta rinnakkaisuudesta saadaan kaikki hyöty irti, toiminnot lisätään NSOperationQueue-jonoon. Jono hallinnoi toimintojen suorittamista usein samanaikaisesti.
Jono päättää toimintojen käynnistysajankohdan niiden valmiuden ja riippuvuuksien perusteella. Säikeistyksestä huolehditaan puolestasi.
Huomaa, kuinka molemmat toiminnot suoritetaan samanaikaisesti:
#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;
}Tehtävien ketjuttaminen riippuvuuksilla
Yksi NSOperation-luokan tehokkaimmista ominaisuuksista on riippuvuuksien määrittäminen. Toiminto voidaan määrittää käynnistymään vasta, kun jokin tietty toinen toiminto (tai toimintojen joukko) on valmis.
Tämä on ratkaisevan tärkeää tehtävissä, jotka on suoritettava tietyssä järjestyksessä, jotta tietojen eheys ja työnkulun oikea toiminta voidaan varmistaa.
Huomaa, kuinka ”Op B” odottaa ”Op A”:ta:
#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;
}Tehtävien hallittu pysäyttäminen
Toimintoja voidaan peruuttaa, mikä on tärkeää käyttäjän pyytämissä pysäytyksissä tai silloin, kun tehtävästä tulee tarpeeton.
Kun toiminto peruutetaan, sen isCancelled-ominaisuuden arvoksi tulee YES. main-metodin (tai lohkon) tulisi tarkistaa tämä ominaisuus säännöllisesti ja lopettaa hallitusti, jos sen arvo on tosi.
Jo käynnistynyt toiminto saattaa silti suorittaa osan työstä ennen kuin se tarkistaa isCancelled-ominaisuuden.
#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;
}Suorituksen jälkeiset toiminnot
Joskus toiminto on suoritettava vasta, kun toiminto on päättynyt, riippumatta siitä, onnistuiko se vai peruutettiinko se.
Jokaisella NSOperation-oliolla on completionBlock-ominaisuus. Tämä lohko suoritetaan mielivaltaisessa säikeessä, kun toiminnon main-metodi (tai NSBlockOperation-toiminnon lohkot) on valmis.
Käytä sitä siivoukseen tai käyttöliittymän päivittämiseen (muista välittää käyttöliittymän päivitykset pääsäikeeseen!).
#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;
}Rinnakkaisuuden hallinta
NSOperationQueue voi suorittaa useita toimintoja samanaikaisesti. Voit hallita tätä toimintaa maxConcurrentOperationCount-ominaisuuden avulla.
1: Toiminnot suoritetaan peräkkäin (yksi kerrallaan).NSOperationQueueDefaultMaxConcurrentOperationCount(yleensä -1): Jono päättää optimaalisen määrän järjestelmän tilanteen perusteella.- Mikä tahansa positiivinen kokonaisluku: Rajoittaa samanaikaisesti suoritettavien toimintojen määrää.
Tämä auttaa estämään resurssien loppumisen ja hallitsemaan työkuormaa.
Testaa ymmärryksesi
Testaa tietosi NSOperation- ja NSOperationQueue-luokista.
NSOperationQueue – yhteenveto
Hienoa! Olet tutustunut NSOperation- ja NSOperationQueue-luokkiin.
- NSOperation edustaa yhtä työyksikköä.
- NSOperationQueue hallinnoi toimintojen suorittamista ja tarjoaa korkeamman tason abstraktion GCD:n päälle.
- Keskeisiä ominaisuuksia ovat riippuvuudet, peruutus, suorituksen valmistumislohkot ja samanaikaisuuden hallinta.
- Käytä
NSBlockOperation-luokkaa yksinkertaisiin tehtäviin ja mukautettuja aliluokkia monimutkaisiin, uudelleenkäytettäviin toimintoihin.
Tämä tehokas kehys auttaa rakentamaan vakaita ja helposti hallittavia samanaikaisia sovelluksia.
Opi Objective-C tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”NSOperationQueue monimutkaisiin tehtäviin” ilmainen?
Kyllä – oppitunnin ”NSOperationQueue monimutkaisiin tehtäviin” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-kurssin, päivitä CoddyKit PROhon. Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”NSOperationQueue monimutkaisiin tehtäviin”?
Tutustukaa NSOperationiin ja NSOperationQueueen rakenteisempaa ja hallittavampaa samanaikaisten tehtävien suoritusta varten, mukaan lukien riippuvuudet. Harjoittelet Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”NSOperationQueue monimutkaisiin tehtäviin”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppitunnilla?
Kyllä. Jokainen Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- NSURLSession API-kutsuihin
- Grand Central Dispatch (GCD)
- NSOperationQueue monimutkaisiin tehtäviin
- JSON-jäsentäminen NSJSONSerializationilla