Untuk apa AppDelegate dan bagaimana saya tahu kapan menggunakannya?

146

Saya baru mulai bekerja di aplikasi iPhone. Bagaimana saya tahu kapan saya harus meletakkan barang di AppDelegate versus kelas khusus? Apakah ada aturan atau jenis analogi dengan bahasa pemrograman lain seperti Python atau PHP yang menggunakan pola AppDelegate like?

resopollution
sumber

Jawaban:

255

Saya biasanya menghindari pendekatan desain yang tersirat oleh penggunaan istilah "jantung aplikasi Anda" oleh Andrew. Apa yang saya maksudkan dengan ini adalah saya pikir Anda harus menghindari penggumpalan terlalu banyak hal di lokasi pusat - desain program yang baik biasanya melibatkan pemisahan fungsi dengan "area yang menjadi perhatian".

Objek delegasi adalah objek yang mendapat pemberitahuan ketika objek yang terhubung mencapai peristiwa atau keadaan tertentu. Dalam hal ini, Delegasi Aplikasi adalah objek yang menerima pemberitahuan ketika objek aplikasi UIA mencapai kondisi tertentu. Dalam banyak hal, ini adalah pola Pengamat satu-ke-satu yang khusus.

Ini berarti bahwa "area yang menjadi perhatian" untuk AppDelegate adalah menangani status aplikasi UIA khusus. Yang paling penting dari ini adalah:

  • applicationDidFinishLaunching: - bagus untuk menangani konfigurasi dan konstruksi saat startup
  • applicationWillTerminate: - baik untuk membersihkan di akhir

Anda harus menghindari menempatkan fungsi lain di AppDelegate karena mereka tidak benar-benar berada di sana. Fungsionalitas lain tersebut meliputi:

  • Data dokumen - Anda harus memiliki manajer dokumen tunggal (untuk beberapa aplikasi dokumen) atau dokumen tunggal (untuk aplikasi dokumen tunggal)
  • Pengontrol tombol / tabel / tampilan, metode delegasi tampilan atau penanganan tampilan lainnya (kecuali untuk konstruksi tampilan tingkat atas di applicationDidFinishLaunching :) - karya ini harus berada dalam kelas controller tampilan masing-masing.

Banyak orang memasukkan hal-hal ini ke dalam AppDelegate mereka karena mereka malas atau mereka pikir AppDelegate mengendalikan keseluruhan program. Anda harus menghindari pemusatan di AppDelegate Anda karena itu mengerutkan area yang menjadi perhatian dalam aplikasi dan tidak skala.

Matt Gallagher
sumber
8
+1 Ini adalah jawaban yang sangat bagus. Saya melihat beberapa contoh kode yang meminta subview memanggil appDelegate untuk menginstruksikan view controller untuk beralih ke subview yang berbeda, dan itu terasa seperti bau kode. Bagus untuk tahu bahwa hidung saya masih berfungsi.
Alan
2
kadang-kadang kita melihat sesuatu seperti ini di tutorial online: AppDelegate * del = [AppDelegate sharedAppDelegate]; (lihat developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… ) apa artinya itu? saya dapat melihat contoh penggunaannya tetapi saya tidak benar-benar memahami teori di baliknya (lihat contoh ini: developer.apple.com/library/ios/#samplecode/… )
abbood
27

Delegasi aplikasi Anda adalah jantung dari aplikasi Anda. Ini secara efektif "Program Controller" Anda.

Delegasi Aplikasi adalah kelas yang menerima pesan tingkat aplikasi, termasuk pesan applicationDidFinishLaunching yang paling umum digunakan untuk memulai pembuatan tampilan lain.

Meskipun tidak persis sama, Anda bisa menganggapnya sebagai rutin "utama ()" dari program Kakao Anda.

Andrew Grant
sumber
Saya memberi +1 kepada Anda karena memiliki semua pengontrol UI di AppDelegate tidak terlalu merepotkan daripada membuat semua kelas khusus untuk itu.
rwols
3
@rwols berhati-hatilah, memisahkan kekhawatiran Anda akan membantu untuk kode yang lebih bersih dan tidak terlalu merepotkan untuk debug, Anda harus meluangkan waktu untuk membuat kelas khusus tersebut dan tidak menempatkan semua pengamat Anda dalam satu file.
wheeliez
2

@ Shivam, terima kasih.

Dari apa yang saya mengerti appDelegate, dekat dengan apa yang Applicationada di Android. Yaitu viewDidLoad, viewDidDisappearsebanding dengan siklus hidup Android. Setiap aplikasi memiliki siklus hidup, dari peluncuran hingga interupsi dari panggilan masuk, hingga pemberitahuan yang muncul. Jika Anda memerlukan kode Anda untuk melakukan sesuatu yang istimewa ketika systemperistiwa ini terjadi maka Anda perlu menulis kode metode.

Di Android kita menggunakan onPause, onDestroy, onCreateagak callback metode untuk menangani kejadian sistem tersebut.

Siddharth
sumber
Metode onPause, onCreatedan onDestroymetode Android lebih mirip dengan viewDidDisappear, viewDidLoadmetode siklus hidup Pengontrol Tampilan iOS. Jika Anda harus membandingkan, saya akan mengatakan Applicationkelas Android akan lebih dekat dengan AppDelegateiOS.
Shivam Bhalla
Terima kasih, jika Anda dapat jawaban saya yang lebih baik, silakan lakukan. Saya akan menghapus jawaban saya setelah membaca jawaban Anda.
Siddharth
1

Semoga ini bisa membantu sedikit lagi ...

Pemrogram yang baru mengenal bahasa ini selalu memiliki pertanyaan yang sama - apakah program dimulai dari metode utama? Ya, Anda benar dalam hal ini; Aplikasi iOS juga mulai dari metode utama.
Kelas utama Anda memanggil fungsi di bawah ini:

 UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

UIApplicationMain memulai loop run Cocoa Touch dan infrastruktur aplikasi yang menciptakan UIApplicationobjek. Aplikasi kami membutuhkan konten sehingga obyektif-c menggunakan delegasi untuk menangani ini. Itu sebabnya kami menyebutnya AppDelegate (bertindak sebagai delegasi UIApplication). Kami menerapkan beberapa metode opsional delegasi itu dan berperilaku sesuai.

Anurag Bhakuni
sumber
tolong dapat seseorang membuat saya mengerti apa yang salah dalam jawaban di atas
Anurag Bhakuni
2
Tampaknya bingung karena a) Anda tidak menggunakan tanda baca / ejaan / tata bahasa yang tepat, b) itu di luar topik karena tidak benar-benar menjawab pertanyaan yang ditanyakan oleh pengirim aslinya.
Kay