Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan · Pelajaran

NSOperationQueue untuk Tugasan Kompleks

Terokai NSOperation dan NSOperationQueue untuk pelaksanaan tugasan serentak yang lebih tersusun dan mudah diurus, termasuk kebergantungan.

Pelajaran 3 daripada 411 langkah

NSOperationQueue untuk Tugasan Kompleks ialah pelajaran Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan merangkumi sejumlah 4 pelajaran.

Mengapa NSOperationQueue?

Anda telah mempelajari Grand Central Dispatch (GCD) untuk tugasan serentak. Walaupun berkuasa, GCD boleh menjadi rumit untuk pengurusan tugasan yang kompleks.

NSOperationQueue menawarkan cara berorientasikan objek pada aras lebih tinggi untuk mengendalikan keserentakan. Ia dibina berasaskan GCD dan menyediakan lebih banyak kawalan serta ciri seperti kebergantungan, pembatalan dan pengurusan keadaan.

Apakah NSOperation?

Teras NSOperationQueue ialah NSOperation. Ia ialah kelas abstrak yang mewakili satu unit kerja yang boleh dilaksanakan secara serentak.

Anda tidak mencipta tika NSOperation secara langsung. Sebaliknya, anda menggunakan subkelas konkritnya atau mencipta subkelas tersuai anda sendiri untuk menentukan tugasan tertentu.

  • Membungkus kerja: Setiap operasi ialah tugasan yang berdikari.
  • Mengurus keadaan: Operasi mempunyai keadaan seperti "sedia", "sedang dilaksanakan" dan "selesai".
  • Menyokong kebergantungan: Operasi boleh bergantung pada operasi lain yang perlu diselesaikan terlebih dahulu.

Bina Operasi Anda Sendiri

Untuk mencipta operasi tersuai, anda membuat subkelas NSOperation dan mengatasi kaedah mainnya. Di sinilah logik tugasan anda diletakkan.

Ingat untuk menandakan operasi anda sebagai "selesai" apabila sudah tamat, khususnya bagi operasi tak segerak. Bagi operasi segerak, main mengendalikannya.

Cuba jalankan operasi tersuai mudah ini:

#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;
}

Tugasan Mudah dengan BlockOperation

Bagi tugasan lebih mudah yang tidak memerlukan subkelas tersuai, NSBlockOperation amat sesuai. Ia membolehkan anda membungkus satu atau lebih blok kod sebagai satu operasi.

Ini sering digunakan untuk tugasan ringkas sekali jalan tanpa beban mencipta kelas baharu.

Berikut ialah cara menggunakannya:

#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;
}

Melaksanakan dengan NSOperationQueue

Untuk memanfaatkan keserentakan sepenuhnya, anda menambahkan operasi pada NSOperationQueue. Baris gilir mengurus pelaksanaan operasi, selalunya secara serentak.

Baris gilir menentukan masa untuk memulakan operasi berdasarkan kesediaan dan kebergantungannya. Baris gilir mengurus urutan jalannya untuk anda.

Perhatikan cara kedua-dua operasi berjalan secara serentak:

#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;
}

Merangkaikan Tugasan dengan Kebergantungan

Salah satu ciri NSOperation yang paling berkuasa ialah penetapan kebergantungan. Sesuatu operasi boleh dikonfigurasikan supaya hanya bermula selepas operasi tertentu yang lain (atau sekumpulan operasi) selesai.

Hal ini penting untuk tugasan yang mesti dilaksanakan mengikut turutan tertentu bagi memastikan ketekalan data atau aliran kerja yang betul.

Perhatikan cara "Op B" menunggu "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;
}

Menghentikan Tugasan dengan Baik

Operasi boleh dibatalkan, yang amat penting apabila pengguna memulakan penghentian atau apabila sesuatu tugasan tidak lagi relevan.

Apabila sesuatu operasi dibatalkan, sifat isCancelled menjadi YES. Kaedah main (atau blok) anda hendaklah memeriksa sifat ini secara berkala dan keluar dengan baik jika nilainya benar.

Operasi yang telah bermula mungkin masih menyelesaikan sebahagian kerja sebelum memeriksa 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;
}

Tindakan Selepas Pelaksanaan

Kadang-kadang anda perlu melakukan tindakan hanya selepas sesuatu operasi selesai, tanpa mengira sama ada operasi itu berjaya atau dibatalkan.

Setiap NSOperation mempunyai sifat completionBlock. Blok ini dilaksanakan pada jalur rawak setelah kaedah main operasi (atau blok bagi NSBlockOperation) selesai.

Gunakannya untuk pembersihan atau untuk mengemas kini antara muka pengguna (ingat untuk menghantar kemas kini antara muka pengguna ke jalur utama!).

#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;
}

Mengurus Keserentakan

Sesuatu NSOperationQueue boleh melaksanakan beberapa operasi secara serentak. Anda boleh mengawal tingkah laku ini menggunakan sifat maxConcurrentOperationCount.

  • 1: Operasi berjalan secara bersiri (satu demi satu).
  • NSOperationQueueDefaultMaxConcurrentOperationCount (biasanya -1): Baris gilir menentukan bilangan optimum berdasarkan keadaan sistem.
  • Sebarang integer positif: Mengehadkan bilangan operasi yang berjalan serentak.

Hal ini membantu mengelakkan kehabisan sumber dan mengurus beban kerja.

Uji Pemahaman Anda

Uji pengetahuan anda tentang NSOperation dan NSOperationQueue.

Imbas Kembali NSOperationQueue

Syabas! Anda telah meneroka NSOperation dan NSOperationQueue.

  • NSOperation mewakili satu unit kerja.
  • NSOperationQueue mengurus pelaksanaan operasi dan menyediakan abstraksi aras lebih tinggi berbanding GCD.
  • Ciri utama termasuk kebergantungan, pembatalan, blok pelengkap dan kawalan terhadap keserentakan.
  • Gunakan NSBlockOperation untuk tugasan mudah dan subkelas tersuai untuk operasi yang kompleks serta boleh digunakan semula.

Rangka kerja berkuasa ini membantu anda membina aplikasi serentak yang teguh dan mudah diurus.

Percuma untuk bermula

Pelajari Objective-C dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “NSOperationQueue untuk Tugasan Kompleks” percuma?

Ya — teks penuh “NSOperationQueue untuk Tugasan Kompleks” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan, tingkat taraf kepada CoddyKit PRO. Kursus Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “NSOperationQueue untuk Tugasan Kompleks”?

Terokai NSOperation dan NSOperationQueue untuk pelaksanaan tugasan serentak yang lebih tersusun dan mudah diurus, termasuk kebergantungan. Anda berlatih Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “NSOperationQueue untuk Tugasan Kompleks” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan ini?

Ya. Setiap pelajaran Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. NSURLSession untuk Panggilan API
  2. Grand Central Dispatch (GCD)
  3. NSOperationQueue untuk Tugasan Kompleks
  4. Menghuraikan JSON dengan NSJSONSerialization
← Kembali ke Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan