AppDelegate คืออะไรและฉันจะทราบได้อย่างไรว่าจะใช้เมื่อใด


146

ฉันเพิ่งเริ่มทำงานกับแอพของ iPhone ฉันจะรู้ได้อย่างไรว่าฉันควรวางสิ่งของใน AppDelegate กับคลาสที่กำหนดเอง มีกฎหรือการเปรียบเทียบใด ๆ กับภาษาโปรแกรมอื่นเช่น Python หรือ PHP ที่ใช้ AppDelegate like pattern หรือไม่?

คำตอบ:


255

ฉันมักจะหลีกเลี่ยงวิธีการออกแบบโดยนัยโดยการใช้คำว่า "หัวใจของแอปพลิเคชันของคุณ" ของ Andrew สิ่งที่ฉันหมายถึงคือฉันคิดว่าคุณควรหลีกเลี่ยงการทำสิ่งของมากเกินไปในตำแหน่งศูนย์กลาง - การออกแบบโปรแกรมที่ดีมักเกี่ยวข้องกับการแยกฟังก์ชันการทำงานด้วย "พื้นที่ที่น่าเป็นห่วง"

วัตถุผู้รับมอบสิทธิ์เป็นวัตถุที่ได้รับแจ้งเมื่อวัตถุที่เชื่อมต่อถึงเหตุการณ์หรือสถานะบางอย่าง ในกรณีนี้ Application Delegate เป็นวัตถุที่ได้รับการแจ้งเตือนเมื่อวัตถุ UIApplication มาถึงบางสถานะ มันเป็นรูปแบบการสังเกตการณ์แบบหนึ่งต่อหนึ่งโดยเฉพาะ

ซึ่งหมายความว่า "พื้นที่ของความกังวล" สำหรับ AppDelegate กำลังจัดการสถานะ UIApplication พิเศษ สิ่งสำคัญที่สุดคือ:

  • applicationDidFinishLaunching: - ดีสำหรับการจัดการกับการกำหนดค่าเริ่มต้นและการก่อสร้าง
  • applicationWillTerminate: - ดีสำหรับการทำความสะอาดในตอนท้าย

คุณควรหลีกเลี่ยงการวางฟังก์ชั่นอื่น ๆ ไว้ใน AppDelegate เนื่องจากไม่มีอยู่จริง ฟังก์ชั่นอื่น ๆ ได้แก่ :

  • ข้อมูลเอกสาร - คุณควรมีตัวจัดการเอกสารเดี่ยว (สำหรับการใช้งานเอกสารหลายใบ) หรือเอกสารเดี่ยว (สำหรับการใช้งานเอกสารเดียว)
  • ปุ่ม / ตาราง / ตัวควบคุมมุมมองวิธีการมอบหมายหรือการจัดการมุมมองอื่น ๆ (ยกเว้นการสร้างมุมมองระดับบนสุดใน applicationDidFinishLaunching :) - งานนี้ควรอยู่ในคลาสตัวควบคุมมุมมองตามลำดับ

หลายคนจับสิ่งเหล่านี้เข้าใน AppDelegate ของพวกเขาเพราะพวกเขาขี้เกียจหรือพวกเขาคิดว่า AppDelegate ควบคุมโปรแกรมทั้งหมด คุณควรหลีกเลี่ยงการรวมศูนย์ใน AppDelegate ของคุณเนื่องจากมันจะทำให้พื้นที่กังวลในแอพและไม่ปรับขนาด


8
+1 นี่คือคำตอบที่ยอดเยี่ยม ฉันกำลังดูโค้ดตัวอย่างบางส่วนที่มีผู้ชมย่อยเรียก appDelegate ทำเพื่อสั่งให้ตัวควบคุมมุมมองเปลี่ยนเป็นมุมมองย่อยอื่นและรู้สึกเหมือนมีกลิ่นรหัส เป็นการดีที่รู้ว่าจมูกของฉันยังใช้งานได้
Alan

2
บางครั้งเราเห็นสิ่งนี้ในบทเรียนออนไลน์: AppDelegate * del = [AppDelegate sharedAppDelegate]; (ดูdeveloper.apple.com/library/mac/#documentation/Cocoa/Conceptual/ ...... ) นั่นหมายความว่าอย่างไร ฉันสามารถดูตัวอย่างการใช้งานได้ แต่ฉันไม่เข้าใจทฤษฎีที่อยู่เบื้องหลัง (ดูตัวอย่างนี้: developer.apple.com/library/ios/#samplecode/… )
abbood

27

ผู้แทนแอปพลิเคชันของคุณคือหัวใจของแอปพลิเคชันของคุณ มันเป็น "โปรแกรมควบคุม" ของคุณอย่างมีประสิทธิภาพ

Application Delegate เป็นคลาสที่รับข้อความระดับแอปพลิเคชันรวมถึงข้อความ applicationDidFinishLaunching ที่ใช้บ่อยที่สุดเพื่อเริ่มต้นการสร้างมุมมองอื่น ๆ

ในขณะที่ไม่เหมือนกันคุณอาจคิดว่ามันเป็นกิจวัตร "main ()" ของโปรแกรมโกโก้ของคุณ


ฉันให้ +1 กับคุณเพราะการมีตัวควบคุม UI ทั้งหมดของคุณใน AppDelegate นั้นสร้างความยุ่งยากน้อยกว่าการสร้างคลาสที่กำหนดเองทั้งหมดสำหรับมัน
rwols

3
@rwols ระวังแยกข้อกังวลของคุณออกเพื่อทำความสะอาดโค้ดและมันไม่ยุ่งยากในการแก้ไขข้อบกพร่องคุณควรใช้เวลาในการสร้างคลาสที่กำหนดเองเหล่านั้นและอย่าวางผู้สังเกตการณ์ทั้งหมดไว้ในไฟล์เดียว
wheeliez

2

@Shivam ขอบคุณ

จากสิ่งที่ฉันเข้าใจappDelegateอยู่ใกล้กับสิ่งที่Applicationอยู่ใน Android viewDidLoad, viewDidDisappearก็เปรียบได้กับสิ่งที่ Android ของระยะเวลาการ ทุกแอปพลิเคชันมีวงจรชีวิตตั้งแต่การเริ่มต้นจนถึงการหยุดชะงักจากการโทรเข้ามาจนถึงการแจ้งเตือนที่ปรากฏขึ้น หากคุณต้องการรหัสเพื่อทำสิ่งพิเศษเมื่อสิ่งเหล่านี้systemเหตุการณ์เกิดขึ้นจากนั้นคุณต้องเขียนรหัสวิธีการ

ใน Android เราใช้onPause, onDestroy, onCreateนะโทรกลับวิธีการที่จะจัดการกับเหตุการณ์ของระบบดังกล่าว


onPause, onCreateและonDestroyวิธีการของ Android มีมากขึ้นคล้ายกับviewDidDisappear, viewDidLoadวิธีการของวงจรชีวิต iOS รุ่นดูควบคุมของ ถ้าคุณต้องเปรียบเทียบฉันจะบอกว่าApplicationระดับของ Android จะใกล้เคียงกับAppDelegateiOS มากขึ้น
Shivam Bhalla

ขอบคุณถ้าคุณสามารถตอบฉันได้ดีกว่าโปรดทำ ฉันจะลบคำตอบของฉันหลังจากอ่านของคุณ
Siddharth

1

หวังว่านี่จะช่วยได้มากกว่านี้ ...

โปรแกรมเมอร์ใหม่ที่ใช้ภาษานี้มีคำถามเดียวกันเสมอ - โปรแกรมเริ่มจากวิธีการหลักหรือไม่? ใช่คุณมีสิทธิ์ในกรณีนี้; แอพ IOS เริ่มจากวิธีการหลัก
ชั้นเรียนหลักของคุณเรียกใช้ฟังก์ชันด้านล่าง:

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

UIApplicationMain เริ่มการทำงานของ Cocoa Touch run loop และโครงสร้างพื้นฐานของแอพซึ่งสร้างUIApplicationวัตถุ แอปพลิเคชันของเราต้องการเนื้อหาดังนั้นวัตถุประสงค์ -c ใช้ผู้รับมอบสิทธิ์ในการจัดการเรื่องนี้ นั่นเป็นเหตุผลที่เราเรียกว่า AppDelegate (ทำหน้าที่เป็นตัวแทนของUIApplication) เราใช้วิธีการทางเลือกบางอย่างของผู้รับมอบสิทธิ์นั้นและจะทำงานตามนั้น


โปรดใครซักคนที่ทำให้ฉันเข้าใจว่าอะไรผิดในคำตอบข้างต้น
Anurag Bhakuni

2
ดูเหมือนจะสับสนเพราะก) คุณไม่ใช้เครื่องหมายวรรคตอน / การสะกดคำ / ไวยากรณ์ที่เหมาะสม b) เป็นหัวข้อนอกเรื่องเนื่องจากไม่ได้ตอบคำถามที่ผู้โพสต์ดั้งเดิมถาม
Kay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.