Saat ini saya sedang belajar sendiri pemrograman iOS, dan satu konsep yang saya rasa sangat sulit untuk dipahami adalah delegasi. Apa itu? Mengapa dan bagaimana ini digunakan? Apa untungnya? Penulisan teknis dari buku yang saya baca membuatnya sulit dimengerti.
11
Jawaban:
Untuk mengerti
delegates
, Anda harus mengertiprotocols
.A
protocol
seperti kontrak layanan. Ketika sebuah objek (paling seringUIViewController
subkelas, tetapi tidak selalu) menandatangani kontrak itu, dikatakan "Saya tertarik untuk memberikan logika untuk mendukung pesan yang Anda kirimkan kepada saya". Ini mirip denganNSNotificationCenter
dalam hal mendaftar untuk tingkat minat, perbedaannya menjadi objek yang mempekerjakan delegasi hanya dapat memiliki satudelegate
pada satu waktu, di mana beberapa objek dapat mendaftar untuk hal yang samaNSNotification
.Apple menggunakan pendelegasian secara luas. Namun, semakin banyak, Anda melihat Apple memindahkan banyak API mereka ke
blocks
, yang serupa dengancallbacks
dalam bahasa lain.Karena itu, delegasi membantu mempertahankan MVC, meskipun saya berpendapat delegasi adalah pola desain itu sendiri. Ini membantu untuk memisahkan model dari pengontrol. Seperti dalam contoh John Cartwright, yang
UITableView
tahu cara menampilkan baris dan bagian. Ia tahu cara menggunakan kembaliUITableViewCells
karena alasan kinerja. Ia tahu semua hal lain yangUIScrollView
diketahui. Tetapi tidak tahu sel mana yang akan ditampilkan. Ia tidak tahu apa yang untuk mengisi sel-sel dengan. Ia tidak tahu sel mana yang digunakan kembali untuk diberikanNSIndexPath
. Ini benar-benar harus menjadi tugas pengontrol. Delegasi memungkinkan tampilan tabel untuk memuat logika non-tampilan ini ke objek yang harus memiliki tanggung jawab itu.Lebih dari itu, Anda tidak dikunci dalam satu delegasi untuk seumur hidup suatu objek. Anda dapat dengan mudah memiliki beberapa sumber data untuk diberikan
UITableView
dan beralih di sekitar saat dibutuhkan.Jadi, di satu sisi, delegasi sangat bagus untuk memasok data ke dan menanggapi interaksi dari suatu objek. Anda akan melihatnya di banyak kelas UIKit, seperti
UITableView
,UIPickerView
,UICollectionView
, dllTetapi delegasi juga sangat berguna ketika Anda ingin menyampaikan informasi antar objek. Anda dapat dengan mudah membuat protokol Anda sendiri dan mendaftar objek Anda sendiri untuk mengikutinya. Selain itu, metode protokol secara
@required
default, tetapi Anda dapat menentukan beberapa metode yang akan@optional
. Ini dapat memberi Anda fleksibilitas yang bagus jika Anda membutuhkannya. Katakanlah Anda memiliki pengontrol tampilan orang tua dan pengontrol tampilan anak. Mungkin Anda menggunakan API Penahanan baru untuk melakukan ini. Biasanya, jika Anda harus meneruskan informasi dari orangtua ke anak, Anda melakukan ini dengan properti. Selesai Tetapi bagaimana jika Anda perlu menyampaikan informasi dari anak kembali ke orang tua? Mungkin sesuatu berubah pada anak dan Anda perlu memberi tahu orang tua. Tentu, Anda bisa melakukan beberapa KVO pada nilai-nilai tertentu. Tapi mungkin Anda ingin tahu kapan tombol ditekan. Cukup buat protokol baru di pengontrol tampilan anakDi MyChildViewController, ketika tombol Anda diketuk, cukup periksa apakah delegasi Anda merespons pesan delegasi (jika diperlukan dan delegasi Anda tidak mengimplementasikan metode, Anda akan macet. Anda dapat membuat metode
@optional
jika perlu) dan mengirim Itu:Kemudian atur delegasi MyChildViewController Anda ke
self
dan terapkan- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController
di controller tampilan induk Anda. LEDAKAN! Anda memiliki informasi yang diteruskan dari anak hingga orang tua. Hubungan antara kedua objek bahkan tidak perlu sedekat orangtua / anak. Ini adalah kontrak layanan, jadi selama objek yang mendaftar menahan akhirnya dari tawar-menawar dengan menerapkan metode yang diperlukan, Anda adalah emas!CATATAN: Delegasi harus lemah / menetapkan properti, jika tidak Anda akan memasuki siklus penahan di mana tidak ada objek yang dapat dideallokasi.
Semoga ini membantu!
sumber
Delegasi adalah objek yang mengimplementasikan fungsi tertentu ketika tidak masuk akal untuk mengimplementasikan fungsi tersebut pada objek normal. Ini adalah bentuk injeksi ketergantungan.
Untuk contoh nyata, lihat protokol UITableViewDelegate. Metode ini tidak masuk akal untuk diterapkan pada tampilan tabel secara langsung, karena tindakan untuk memilih baris tampilan tabel akan berbeda di setiap aplikasi dan mungkin di setiap tampilan tabel. Delegasi memiliki metode
-tableView:didSelectRowAtIndexPath:
sehingga Anda dapat membuat objek yang menangani pemilihan baris tanpa subklasifikasi tampilan tabel untuk setiap tindakan terpisah yang ingin Anda terapkan.sumber