Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. iOS SDK

Bekerja dengan Kelas NSOperationQueue

by
Read Time:9 minsLanguages:

Indonesian (Bahasa Indonesia) translation by Nurul Fatimah (you can also view the original English article)

Multi-tasking mencegah aplikasi dari freezing.  Dalam sebagian besar bahasa pemrograman, pencapaian ini agak sedikit rumit, tetapi kelas NSOperationQueue di iOS membuatnya mudah!

Tutorial ini akan menunjukkan bagaimana menggunakan NSOperationQueue kelas. Sebuah objek NSOperationQueue adalah suatu antrian yang menangani objek dari jenis yang kelas NSOperation. Objek NSOperation, hanya diungkapkan, mewakili satu tugas, termasuk data dan kode yang terkait dengan tugas. NSOperationQueue menangani dan mengelola eksekusi semua objek NSOperation (tugas) yang telah ditambahkan ke dalamnya. Eksekusi berlangsung dengan rangkaian utama aplikasi. Ketika sebuah objek NSOperation ditambahkan ke antrian, ia dieksekusi segera dan tidak meninggalkan antrian sampai selesai. Tugas dapat dibatalkan, tetapi tidak dihapus dari antrean sampai selesai. Kelas NSOperation adalah satu abstrak sehingga tidak bisa digunakan secara langsung dalam program. Sebaliknya, ada dua subkelas disediakan, kelas NSInvocationOperation dan kelas NSBlockOperation. Saya akan menggunakan yang pertama dalam tutorial ini.


Contoh proyek

Inilah tujuan untuk tutorial ini: untuk setiap rangkaian tambahan kita ingin aplikasi kita membuat objek NSInvocationOperation (NSOperation). Kita akan menambahkan setiap objek menjadi NSOperationQueue dan kemudian kita selesai. Antrean mengambil alih segalanya dan aplikasi bekerja tanpa freezing. Untuk menunjukkan dengan jelas penggunaan kelas yang saya sebutkan di atas, kita akan membuat proyek sampel (sederhana) di mana, selain dari rangkaian utama aplikasi, kita akan memiliki dua rangkaian lagi yang berjalan bersamanya. Pada utas rangkaian, loop akan berjalan dari 1 hingga 10.000.000 dan setiap 100 langkah label akan diperbarui dengan nilai counter loop. Pada rangkaian kedua, background sebuah label akan mengisi dengan warna kustom. Proses ini akan mengambil tempat di dalam lingkaran dan itu akan dijalankan lebih dari sekali. Jadi kita akan memiliki sesuatu seperti rotator warna. Pada saat yang sama, nilai-nilai RGB warna background custom dengan nilai konter loop akan ditampilkan di samping label. Akhirnya, kita akan menggunakan tiga tombol untuk mengubah warna background pemandangan yang pada rangkaian. Tugas ini tidak akan dijalankan secara bersamaan tanpa multi-tasking. Berikut ini adalah hasil akhirnya:

demo_app

Langkah 1: Buat Proyek

Mari kita mulai dengan menciptakan proyek. Buka Xcode dan buat Single View Application baru.

project_templateproject_templateproject_template

Klik Next dan menetapkan nama untuk proyek. Saya menamakannya ThreadingTestApp. Anda dapat menggunakan yang sama atau nama lain yang Anda suka.

project_nameproject_nameproject_name

Berikutnya. Selesaikan proyek penciptaan.

project_creationproject_creationproject_creation

Langkah 2: Setup Interface

Klik pada file ViewController.xib untuk mengungkapkan Builder interface. Tambahkan kontrol berikut untuk membuat interface seperti gambar berikutnya:

ib_sampleib_sampleib_sample
  1. UINavigationBar
    • Frame (x, y, W, H): 0, 0, 320, 44
    • Tintcolor: Warna hitam
    • Title: "Simple Multi-Threading Demo"
  2. UILabel
    • Frame (x, y, W, H): 20, 59, 280, 21
    • Text: "Counter at Thread #1"
  3. UILabel
    • Frame (x, y, W, H): 20, 88, 280, 50
    • Background color: Warna light gray
    • Text color: Warna dark gray
    • Text: -
  4. UILabel
    • Frame (x, y, W, H): 20, 154, 280, 21
    • Text: "Random Color Rotator at Thread #2"
  5. UILabel
    • Frame (x, y, W, H): 20, 183, 100, 80
    • Background color: Warna light gray
    • Text: -
  6. UILabel
    • Frame (x, y, W, H): 128, 183, 150, 80
    • Text: -
  7. UILabel
    • Frame (x, y, W, H): 20, 374, 280, 21
    • Text: "Background Color at Main Thread"
  8. UIButton
    • Frame (x, y, W, H): 20, 403, 73, 37
    • Title: "Color #1"
  9. UIButton
    • Frame (x, y, W, H): 124, 403, 73, 37
    • Title: "Color #2"
  10. UIButton
    • Frame (x, y, W, H): 228, 403, 73, 37
    • Title: "Color #3"

Untuk UILabel terakhir dan tiga UIButtons, atur nilai Autosizing ke Kiri - Bawah untuk membuat interface terlihat bagus pada iPhone 4 / 4S dan iPhone 5, seperti gambar berikutnya:

autosizingautosizingautosizing

Langkah 3: Properti IBOutlet dan Metode IBAction

Pada langkah berikutnya, kita akan membuat properti IBOutlet dan metode IBAction yang diperlukan untuk membuat contoh aplikasi kita berfungsi. Untuk membuat properti dan metode baru, dan hubungkan ke kontrol Anda saat menjadi Interface Builder, klik tombol tengah tombol Editor di toolbar Xcode untuk membuka Assistant Editor:

assistant_editor

Kontrol tidak setiap kebutuhan properti outlet. Kita hanya akan menambahkan satu untuk UILabel 3, 5, dan 6 (sesuai urutan yang tercantum pada langkah 2), bernama label1, label2, dan label3.

Untuk memasukkan properti outlet baru, Control + Klik (Klik kanan) pada label > Klik pada Outlet Referensi Baru > Seret dan Turunkan ke Asisten Editor. Setelah itu, tentukan nama untuk properti baru, seperti pada gambar berikut:

outlet1outlet1outlet1Memasukkan properti IBOutlet baru

outlet2outlet2outlet2
Menetapkan nama properti IBOutlet

Ulangi proses di atas tiga kali untuk menghubungkan ketiga UILabel ke properti. Di dalam file ViewController.h Anda, Anda memiliki properti ini yang dinyatakan:

Sekarang tambahkan metode IBAction untuk ketiga UIButtons. Masing-masing tombol akan mengubah warna background tampilan. Untuk memasukkan metode IBAction baru, Control + Click (Klik kanan) pada UIButton > Klik pada Touch Up Inside > Drag dan Drop ke Asisten Editor. Setelah itu tentukan nama untuk metode baru. Lihatlah gambar berikut dan cuplikan berikutnya untuk nama metode:

ibaction1ibaction1ibaction1
Memasukkan metode IBAction baru
ibaction2ibaction2ibaction2
Menetapkan nama metode IBAction

Sekali lagi, ulangi proses di atas tiga kali untuk menghubungkan setiap UIButton ke metode tindakan. File ViewController.h sekarang harus berisi ini:

Properti IBOutlet dan metode IBAction sudah siap. Kita sekarang dapat mulai pengkodean.


Langkah 4: Objek NSOperationQueue dan Deklarasi Metode Tugas-Terkait yang Diperlukan

Salah satu tugas terpenting yang harus kita lakukan adalah mendeklarasikan objek NSOperationQueue (antrian operasi), yang akan digunakan untuk menjalankan tugas kami di utas sekunder. Buka file ViewController.h dan tambahkan konten berikut tepat setelah header @interface (jangan lupa tanda kurung kurawal):

Juga, setiap tugas harus memiliki setidaknya satu metode yang berisi kode yang akan dijalankan bersamaan dengan rangkaian utama. Menurut deskripsi pendahuluan, tugas pertama metode akan diberi nama counterTask dan yang kedua akan diberi nama colorRotatorTask:

Itulah semua yang kita butuhkan. File ViewController.h kita akan terlihat seperti ini:

Mari kita lanjutkan ke implementasi.


Langkah 5: implementasi

Kita hampir selesai. Kita telah mengatur interface, membuat semua koneksi yang diperlukan, menyatakan IBAction yang diperlukan dan metode lain, dan membangun basis. Sekarang saatnya untuk membangunnya.

Buka file ViewController.m dan masuk ke metode viewDidLoad. Bagian terpenting dari tutorial ini akan berlangsung di sini. Kita akan membuat instance NSOperationQueue baru dan dua objek NSOperation (NSInvocationOperation). Objek-objek ini akan merangkum kode dari dua metode yang sebelumnya kita nyatakan dan kemudian mereka akan dieksekusi sendiri oleh NSOperationQueue. Berikut ini kodenya:

Seluruh proses ini sangat sederhana. Setelah membuat instance NSOperationQueue, kita membuat objek NSInvocationOperation (operasi). Kita mengatur metode pemilihnya (kode yang diinginkan dieksekusi pada utas yang terpisah), dan kemudian kita menambahkannya ke antrian. Setelah memasuki antrean segera mulai berjalan. Setelah itu objek operasi dapat dilepaskan, karena antrean bertanggung jawab untuk menanganinya mulai dari sekarang. Dalam hal ini kita membuat objek lain dan kita akan menggunakannya dengan cara yang sama untuk tugas kedua (colorRotatorTask).

Tugas kita berikutnya adalah mengimplementasikan dua metode selektor. Mari kita mulai dengan menulis metode counterTask. Ini akan berisi for loop yang akan berjalan untuk sejumlah besar iterasi dan setiap 100 langkah teks label1 akan diperbarui dengan nilai counter iterasi saat ini (i). Kode ini sederhana, jadi di sini adalah segalanya:

Harap dicatat bahwa ini direkomendasikan sebagai praktik terbaik (bahkan oleh Apple) untuk melakukan pembaruan visual apa pun pada antarmuka menggunakan rangkaian utama dan bukan dengan melakukannya langsung dari utas sekunder. Oleh karena itu, penggunaan metode performSelectorOnMainThread diperlukan dalam kasus seperti ini.

Sekarang mari kita menerapkan metode colorRotatorTask:

Anda dapat melihat bahwa kita menggunakan metode performSelectorOnMainThread di sini juga. Langkah selanjutnya adalah [NSThread sleepForTimeInterval: 0,4]; perintah, yang digunakan untuk menyebabkan beberapa penundaan singkat (0,4 detik) dalam setiap eksekusi loop. Meskipun tidak perlu menggunakan metode ini, lebih baik untuk menggunakannya di sini untuk memperlambat perubahan warna background label2 UILabel (rotator warna). Selain itu di setiap loop kita membuat nilai acak untuk warna merah, hijau, dan biru. Kita kemudian menetapkan nilai-nilai ini untuk menghasilkan warna kustom dan mengaturnya sebagai warna backgorund di label2 UILabel.

Pada titik ini dua tugas yang akan dieksekusi pada saat yang sama dengan utas utama sudah siap. Mari terapkan ketiga metode IBAction (sangat mudah) dan kemudian kita siap untuk lanjut. Seperti yang telah saya sebutkan, ketiga UIButtons akan mengubah warna latar belakang tampilan, dengan tujuan akhir untuk menunjukkan bagaimana utas utama dapat berjalan di samping dua tugas lainnya. Ini dia:

Itu dia! Sekarang Anda dapat menjalankan aplikasi dan melihat bagaimana tiga tugas yang berbeda dapat dilakukan pada saat yang bersamaan. Ingat bahwa ketika eksekusi objek NSOperation selesai, maka secara otomatis akan meninggalkan antrian.


Kesimpulan

Banyak dari Anda mungkin telah menemukan bahwa kode aktual untuk menjalankan aplikasi multi-tasking hanya membutuhkan beberapa baris kode. Tampaknya beban kerja terbesar adalah menerapkan metode yang diperlukan yang bekerja dengan setiap tugas. Namun demikian, metode ini adalah cara mudah untuk mengembangkan aplikasi multi-threading di iOS.

Advertisement
Did you find this post useful?
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.