Apa itu Delegasi dan mengapa itu penting dalam pemrograman iOS?

11

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.

DCIndieDev
sumber
4
Anda mungkin menemukan persimpangan tag + delegasi obyektif pada stack overflow berguna.

Jawaban:

16

Untuk mengerti delegates, Anda harus mengerti protocols.

A protocolseperti kontrak layanan. Ketika sebuah objek (paling sering UIViewControllersubkelas, tetapi tidak selalu) menandatangani kontrak itu, dikatakan "Saya tertarik untuk memberikan logika untuk mendukung pesan yang Anda kirimkan kepada saya". Ini mirip dengan NSNotificationCenterdalam hal mendaftar untuk tingkat minat, perbedaannya menjadi objek yang mempekerjakan delegasi hanya dapat memiliki satu delegatepada satu waktu, di mana beberapa objek dapat mendaftar untuk hal yang sama NSNotification.

Apple menggunakan pendelegasian secara luas. Namun, semakin banyak, Anda melihat Apple memindahkan banyak API mereka ke blocks, yang serupa dengan callbacksdalam 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 UITableViewtahu cara menampilkan baris dan bagian. Ia tahu cara menggunakan kembali UITableViewCellskarena alasan kinerja. Ia tahu semua hal lain yang UIScrollViewdiketahui. 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 diberikan NSIndexPath. 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 UITableViewdan 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, dll

Tetapi 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 @requireddefault, 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 anak

@protocol MyChildDelegate
- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController;
@end

@interface MyChildViewController : UIViewController

@property (weak, nonatomic) id <MyChildDelegate> delegate;

@end

Di 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 @optionaljika perlu) dan mengirim Itu:

- (IBAction)someButtonTapped:(id)sender {
    if ([self.delegate respondsToSelector:@selector(buttonWasTappedInChild:)]) {
        [self.delegate buttonWasTappedInChild:self];
    }
}

Kemudian atur delegasi MyChildViewController Anda ke selfdan terapkan - (void)buttonWasTappedInChild:(MyChildViewController *)childViewControllerdi 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!

jmstone
sumber
2

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.

John Cartwright
sumber