Saya belajar tentang pemrograman bersamaan untuk iOS. Sejauh ini saya sudah membaca tentang NSOperation
/NSOperationQueue
dan GCD
. Apa alasan untuk menggunakan NSOperationQueue
lebih GCD
dan sebaliknya?
Kedengarannya seperti keduanya GCD
dan NSOperationQueue
abstrak jauh penciptaan eksplisit NSThreads
dari pengguna. Namun hubungan antara kedua pendekatan itu tidak jelas bagi saya sehingga umpan balik untuk dihargai!
ios
concurrency
grand-central-dispatch
nsoperation
nsoperationqueue
Minggu Senin
sumber
sumber
Jawaban:
GCD
adalah API berbasis C tingkat rendah yang memungkinkan penggunaan model konkurensi berbasis tugas yang sangat sederhana.NSOperation
danNSOperationQueue
kelas Objective-C yang melakukan hal serupa.NSOperation
diperkenalkan pertama kali, tetapi pada 10.5 dan iOS 2 ,NSOperationQueue
dan teman-teman diimplementasikan secara internal menggunakanGCD
.Secara umum, Anda harus menggunakan tingkat abstraksi tertinggi yang sesuai dengan kebutuhan Anda. Ini berarti bahwa Anda biasanya harus menggunakan
NSOperationQueue
alih-alihGCD
, kecuali jika Anda perlu melakukan sesuatu yangNSOperationQueue
tidak mendukung.Perhatikan bahwa
NSOperationQueue
ini bukan versi GCD "bodoh"; sebenarnya, ada banyak hal yang dapat Anda lakukan dengan sangat sederhanaNSOperationQueue
yang membutuhkan banyak pekerjaan dengan murniGCD
. (Contoh: antrian terbatas-bandwidth yang hanya menjalankan operasi N pada satu waktu; membangun ketergantungan antar operasi. Keduanya sangat sederhanaNSOperation
, sangat sulit denganGCD
.) Apple telah melakukan kerja keras memanfaatkan GCD untuk membuat API ramah objek yang sangat bagusNSOperation
. Manfaatkan pekerjaan mereka kecuali Anda memiliki alasan untuk tidak melakukannya.Peringatan : Di sisi lain, jika Anda benar-benar hanya perlu mengirim blok, dan tidak memerlukan fungsi tambahan apa pun yang
NSOperationQueue
menyediakan, tidak ada yang salah dengan menggunakan GCD. Pastikan itu adalah alat yang tepat untuk pekerjaan itu.sumber
Sejalan dengan jawaban saya untuk pertanyaan terkait , saya tidak akan setuju dengan BJ dan menyarankan Anda melihat GCD lebih dulu dari NSOperation / NSOperationQueue, kecuali yang terakhir menyediakan sesuatu yang Anda butuhkan, sedangkan GCD tidak.
Sebelum GCD, saya menggunakan banyak NSOperations / NSOperationQueues dalam aplikasi saya untuk mengelola konkurensi. Namun, sejak saya mulai menggunakan GCD secara teratur, saya hampir sepenuhnya mengganti NSOperations dan NSOperationQueues dengan blok dan mengirim antrian. Ini datang dari bagaimana saya menggunakan kedua teknologi dalam praktik, dan dari profil yang saya lakukan pada mereka.
Pertama, ada jumlah overhead nontrivial saat menggunakan NSOperations dan NSOperationQueues. Ini adalah objek Kakao, dan mereka perlu dialokasikan dan dialokasikan. Dalam aplikasi iOS yang saya tulis yang menjadikan adegan 3-D pada 60 FPS, saya menggunakan NSOperations untuk merangkum setiap frame yang diberikan. Ketika saya memprofilkan ini, pembuatan dan penghancuran NSOperations ini merupakan bagian penting dari siklus CPU dalam aplikasi yang sedang berjalan, dan memperlambat segalanya. Saya menggantinya dengan blok sederhana dan antrian serial GCD, dan overhead itu hilang, yang menyebabkan kinerja rendering yang lebih baik. Ini bukan satu-satunya tempat di mana saya perhatikan overhead menggunakan NSOperations, dan saya sudah melihat ini di Mac dan iOS.
Kedua, ada keanggunan untuk kode pengiriman berbasis blok yang sulit untuk dicocokkan ketika menggunakan NSOperations. Sangat nyaman untuk membungkus beberapa baris kode dalam satu blok dan mengirimkannya untuk dilakukan pada antrian serial atau bersamaan, di mana membuat NSOperation khusus atau NSInvocationOperation untuk melakukan ini memerlukan lebih banyak kode pendukung. Saya tahu bahwa Anda dapat menggunakan NSBlockOperation, tetapi Anda mungkin akan mengirim sesuatu ke GCD saat itu. Membungkus kode ini dalam blok sejalan dengan pemrosesan terkait dalam aplikasi Anda mengarah pada pendapat saya untuk organisasi kode yang lebih baik daripada memiliki metode terpisah atau NSOperations khusus yang merangkum tugas-tugas ini.
NSOperations dan NSOperationQueues masih memiliki kegunaan yang sangat baik. GCD tidak memiliki konsep dependensi yang nyata, di mana NSOperationQueues dapat mengatur grafik ketergantungan yang cukup kompleks. Saya menggunakan NSOperationQueues untuk ini dalam beberapa kasus.
Secara keseluruhan, sementara saya biasanya menganjurkan untuk menggunakan abstraksi tingkat tertinggi yang menyelesaikan tugas, ini adalah satu kasus di mana saya berdebat untuk API tingkat rendah GCD. Di antara pengembang iOS dan Mac saya sudah bicara dengan ini, sebagian besar memilih untuk menggunakan GCD lebih dari NSOperations kecuali mereka menargetkan versi OS tanpa dukungan untuk itu (sebelum iOS 4.0 dan Snow Leopard).
sumber
GCD
adalah API berbasis C tingkat rendah.NSOperation
danNSOperationQueue
adalah kelas Objective-C.NSOperationQueue
adalah objektif C wrapper berakhirGCD
. Jika Anda menggunakan NSOperation, maka Anda secara implisit menggunakan Grand Central Dispatch.Keuntungan GCD dibandingkan NSOperation:
i. Implementasi
Untuk
GCD
implementasi sangat ringan-NSOperationQueue
kompleks dan berat-beratKeuntungan NSOperation dibandingkan GCD:
saya. Kontrol Pada Operasi
Anda dapat Jeda, Batalkan, Lanjutkan
NSOperation
ii. Ketergantungan
Anda dapat mengatur ketergantungan antara dua
NSOperations
operasi tidak akan dimulai sampai semua dependensinya kembali benar untuk selesai.
aku aku aku. Keadaan Operasi
dapat memantau keadaan operasi atau antrian operasi. siap, menjalankan atau selesai
iv. Jumlah Operasi Maks.
Anda dapat menentukan jumlah operasi antrian maksimum yang dapat berjalan secara bersamaan
Kapan Pergi
GCD
atauNSOperation
ketika Anda ingin lebih mengontrol antrian (semua yang disebutkan di atas) digunakan
NSOperation
dan untuk kasus-kasus sederhana di mana Anda ingin lebih sedikit overhead (Anda hanya ingin melakukan beberapa pekerjaan "ke latar belakang" dengan sedikit pekerjaan tambahan) gunakanGCD
ref:
https://cocoacasts.com/choosing-between-nsoperation-and-grand-central-dispatch/ http://iosinfopot.blogspot.in/2015/08/nsthread-vs-gcd-vs-nsoperationqueue.html http : //nshipster.com/nsoperation/
sumber
Alasan lain untuk lebih memilih NSOperation daripada GCD adalah mekanisme pembatalan NSOperation. Misalnya, Aplikasi seperti 500px yang menampilkan puluhan foto, gunakan NSOperation, kami dapat membatalkan permintaan sel gambar yang tidak terlihat saat kami menggulir tampilan tabel atau tampilan koleksi, ini dapat sangat meningkatkan kinerja App dan mengurangi jejak memori. GCD tidak dapat dengan mudah mendukung ini.
Juga dengan NSOperation, KVO dapat dimungkinkan.
Ini adalah artikel dari Eschaton yang layak dibaca.
sumber
NSOperation
, karenaNSURLSessionTask.cancel
danNSURLSession.invalidateAndCancel
menyediakan fungsi ini. Secara umum,NSURLSession
menyediakan beberapa fungsi dari sebuahNSOperationQueue
, sepertiNSURLSessionTask
menyediakan beberapa fungsi dari sebuahNSOperation
GCD memang lebih rendah levelnya daripada NSOperationQueue, keuntungan utamanya adalah implementasinya sangat ringan dan fokus pada algoritma dan kinerja bebas kunci.
NSOperationQueue memang menyediakan fasilitas yang tidak tersedia dalam GCD, tetapi mereka datang dengan biaya non-sepele, implementasi NSOperationQueue kompleks dan berat, melibatkan banyak penguncian, dan menggunakan GCD secara internal hanya dengan cara yang sangat minimal.
Jika Anda memerlukan fasilitas yang disediakan oleh NSOperationQueue dengan segala cara menggunakannya, tetapi jika GCD cukup untuk kebutuhan Anda, saya akan merekomendasikan menggunakannya secara langsung untuk kinerja yang lebih baik, secara signifikan lebih rendah CPU dan biaya daya dan fleksibilitas lebih banyak.
sumber
NSQueueOperations dan GCD memungkinkan menjalankan tugas komputasi berat di latar belakang pada utas terpisah dengan membebaskan Tapak Utama Aplikasi UI.
Nah, berdasarkan posting sebelumnya kita melihat NSOperations memiliki addDependency sehingga Anda dapat mengantri operasi Anda satu demi satu secara berurutan.
Tapi saya juga membaca tentang Antrian serial GCD yang dapat Anda buat jalankan operasi Anda dalam antrian menggunakan dispatch_queue_create. Ini akan memungkinkan menjalankan serangkaian operasi satu demi satu secara berurutan.
Keuntungan NSQueueOperation dibandingkan GCD:
Hal ini memungkinkan untuk menambah ketergantungan dan memungkinkan Anda untuk menghapus ketergantungan sehingga untuk satu transaksi Anda dapat menjalankan urutan menggunakan ketergantungan dan untuk transaksi lainnya berjalan bersamaan sementara GCD tidak mengizinkan untuk menjalankan cara ini.
Sangat mudah untuk membatalkan operasi jika dalam antrian itu dapat dihentikan jika sedang berjalan.
Anda dapat menentukan jumlah maksimum operasi bersamaan.
Anda dapat menangguhkan operasi yang ada di Antrian
Anda dapat menemukan berapa banyak operasi yang tertunda ada dalam antrian.
sumber
GCD sangat mudah digunakan - jika Anda ingin melakukan sesuatu di latar belakang, yang perlu Anda lakukan hanyalah menulis kode dan mengirimkannya pada antrian latar belakang. Melakukan hal yang sama dengan NSOperation adalah banyak pekerjaan tambahan.
Keuntungan NSOperation adalah (a) Anda memiliki objek nyata yang dapat Anda kirimi pesan, dan (b) Anda dapat membatalkan NSOperation. Itu tidak sepele. Anda perlu subkelas NSOperation, Anda harus menulis kode dengan benar sehingga pembatalan dan menyelesaikan tugas keduanya berfungsi dengan benar. Jadi untuk hal-hal sederhana Anda menggunakan GCD, dan untuk hal-hal yang lebih rumit, Anda membuat subkelas NSOperation. (Ada subkelas NSInvocationOperation dan NSBlockOperation, tetapi semua yang mereka lakukan lebih mudah dilakukan dengan GCD, jadi tidak ada alasan yang baik untuk menggunakannya).
sumber
Nah, NSOperations hanyalah sebuah API yang dibangun di atas Grand Central Dispatch. Jadi ketika Anda menggunakan NSOperations, Anda benar-benar masih menggunakan Grand Central Dispatch. Hanya saja NSOperations memberi Anda beberapa fitur mewah yang mungkin Anda sukai. Anda dapat membuat beberapa operasi bergantung pada operasi lain, menyusun ulang antrian setelah Anda membuang item, dan hal-hal lain seperti itu. Bahkan, ImageGrabber sudah menggunakan operasi NSO dan antrian! ASIHTTPRequest menggunakannya di bawah tenda, dan Anda dapat mengonfigurasi antrian operasi yang digunakan untuk perilaku berbeda jika Anda mau. Jadi yang mana yang harus Anda gunakan? Apapun yang masuk akal untuk aplikasi Anda. Untuk aplikasi ini cukup sederhana sehingga kami hanya menggunakan Grand Central Dispatch secara langsung, tidak perlu fitur-fitur mewah NSOperation. Tetapi jika Anda membutuhkannya untuk aplikasi Anda, jangan ragu untuk menggunakannya!
sumber