AppDelegate dùng để làm gì và làm thế nào để tôi biết khi nào nên sử dụng nó?


146

Tôi mới bắt đầu làm việc trên các ứng dụng iPhone. Làm cách nào để biết khi nào tôi nên đưa nội dung vào AppDelegate so với lớp tùy chỉnh? Có một quy tắc hoặc bất kỳ loại tương tự với ngôn ngữ lập trình khác như Python hoặc PHP sử dụng mẫu giống như AppDelegate không?

Câu trả lời:


255

Tôi thường tránh cách tiếp cận thiết kế ngụ ý khi Andrew sử dụng thuật ngữ "trái tim của ứng dụng của bạn". Điều tôi muốn nói là tôi nghĩ bạn nên tránh bỏ quá nhiều thứ vào một vị trí trung tâm - thiết kế chương trình tốt thường liên quan đến việc tách chức năng theo "khu vực quan tâm".

Đối tượng ủy nhiệm là một đối tượng được thông báo khi đối tượng được kết nối đến các sự kiện hoặc trạng thái nhất định. Trong trường hợp này, Đại biểu ứng dụng là một đối tượng nhận thông báo khi đối tượng UIApplication đạt đến một số trạng thái nhất định. Trong nhiều khía cạnh, nó là một mẫu Observer một-một chuyên biệt.

Điều này có nghĩa là "khu vực quan tâm" đối với AppDelegate đang xử lý các trạng thái UIApplication đặc biệt. Điều quan trọng nhất trong số này là:

  • applicationDidFinishLaunching: - tốt cho việc xử lý cấu hình và khởi động khi khởi động
  • applicationWillTerminate: - tốt cho việc dọn dẹp vào cuối

Bạn nên tránh đưa các chức năng khác vào AppDelegate vì chúng không thực sự thuộc về nơi đó. Các chức năng khác bao gồm:

  • Dữ liệu tài liệu - bạn nên có một đơn vị quản lý tài liệu (đối với nhiều ứng dụng tài liệu) hoặc đơn lẻ tài liệu (đối với các ứng dụng tài liệu đơn lẻ)
  • Trình điều khiển nút / bảng / chế độ xem, phương thức đại biểu hoặc xử lý chế độ xem khác (ngoại trừ việc xây dựng chế độ xem cấp cao nhất trong applicationDidFinishLaunching :) - công việc này phải nằm trong các lớp trình điều khiển chế độ xem tương ứng.

Nhiều người gộp những thứ này vào AppDelegate của họ vì họ lười biếng hoặc họ nghĩ AppDelegate kiểm soát toàn bộ chương trình. Bạn nên tránh tập trung vào AppDelegate của mình vì nó làm mờ các khu vực quan tâm trong ứng dụng và không mở rộng quy mô.


8
+1 Đây là một câu trả lời tuyệt vời. Tôi đang xem xét một số mã mẫu có các cuộc phỏng vấn, hãy gọi appDelegate để hướng dẫn một bộ điều khiển xem chuyển sang một chế độ xem khác và cảm giác giống như mùi mã. Thật tốt khi biết mũi của tôi vẫn hoạt động.
Alan

2
đôi khi chúng ta thấy một cái gì đó như thế này trong các hướng dẫn trực tuyến: AppDelegate * del = [AppDelegate sharedAppDelegate]; (xem developer.apple.com/l Library / mac / # document / Cocoa / Conceptionual / trên ) điều đó có nghĩa là gì? Tôi có thể thấy các ví dụ về việc sử dụng nó nhưng tôi không thực sự hiểu lý thuyết đằng sau nó (xem ví dụ này: developer.apple.com/l
Library / ios / # samplecode / Lỗi

27

Đại biểu ứng dụng của bạn là trái tim của ứng dụng của bạn. Đó thực sự là "Trình điều khiển chương trình" của bạn.

Đại biểu ứng dụng là lớp nhận các thông báo ở cấp ứng dụng, bao gồm thông báo applicationDidFinishLaunching được sử dụng phổ biến nhất để bắt đầu tạo các chế độ xem khác.

Mặc dù không hoàn toàn giống nhau nhưng bạn có thể nghĩ nó là thói quen "chính ()" của chương trình Ca cao của bạn.


Tôi đang cung cấp +1 cho bạn vì có tất cả các bộ điều khiển UI của bạn trong AppDelegate sẽ ít gặp rắc rối hơn so với việc tạo tất cả các lớp tùy chỉnh cho nó.
rwols

3
@rwols hãy cẩn thận, tách biệt mối quan tâm của bạn để giúp mã sạch hơn và ít gặp rắc rối hơn, bạn nên dành thời gian để tạo các lớp tùy chỉnh đó và không đặt tất cả các trình quan sát của bạn vào một tệp.
wheeliez

2

@Shivam, cảm ơn.

Từ những gì tôi hiểu appDelegate, gần với những gì một Applicationtrong Android. Các viewDidLoad, viewDidDisappearcó thể so sánh với những gì Vòng đời của Android. Mọi ứng dụng đều có vòng đời, từ khởi chạy đến gián đoạn từ các cuộc gọi đến, đến các thông báo hiển thị. Nếu bạn cần mã của mình để làm một cái gì đó đặc biệt khi những systemsự kiện này xảy ra thì bạn cần phải viết mã các phương thức.

Trong Android chúng tôi sử dụng onPause, onDestroy, onCreatekinda gọi lại phương pháp để xử lý các sự kiện hệ thống như vậy.


Các onPause, onCreateonDestroyphương pháp của Android cũng tương tự như nhiều vào viewDidDisappear, viewDidLoadphương pháp vòng đời một iOS Xem lý lịch thành Controller. Nếu bạn phải so sánh, tôi sẽ nói rằng Applicationlớp Android sẽ gần với AppDelegateiOS hơn.
Shivam Bhalla

Cảm ơn, nếu bạn có thể tốt hơn câu trả lời của tôi xin vui lòng làm. Tôi sẽ xóa câu trả lời của tôi sau khi đọc của bạn.
Siddharth

1

Hy vọng điều này sẽ giúp thêm một chút ...

Các lập trình viên mới sử dụng ngôn ngữ này luôn có cùng một câu hỏi - chương trình có bắt đầu từ một phương thức chính không? Vâng, bạn đúng trong trường hợp này; Các ứng dụng iOS cũng bắt đầu từ một phương thức chính.
Lớp chính của bạn gọi hàm dưới đây:

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

UIApplicationMain khởi động cơ sở hạ tầng ứng dụng và vòng lặp ứng dụng Cacao Touch tạo ra một UIApplicationđối tượng. Ứng dụng của chúng tôi cần nội dung nên object-c sử dụng một đại biểu để xử lý việc này. Đó là lý do tại sao chúng tôi gọi nó là AppDelegate (đóng vai trò là đại biểu UIApplication). Chúng tôi thực hiện một số phương pháp tùy chọn của đại biểu đó và nó hành xử tương ứng.


xin vui lòng ai đó có thể làm cho tôi hiểu những gì sai trong câu trả lời ở trên
Anurag Bhakuni

2
Có vẻ như bối rối vì a) bạn không sử dụng dấu câu / chính tả / ngữ pháp phù hợp, b) nó không đúng chủ đề vì nó không thực sự trả lời câu hỏi mà người đăng ban đầu đã hỏi.
Kay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.