2012-02-09 24 views
5

Đối với hầu hết các ứng dụng của tôi, tôi đã đặt tất cả các logic trong các lớp, mỗi ViewController cũng sẽ nhận được một tham chiếu quá, hoặc tạo/giải phóng đối tượng.Có ổn không khi đặt hầu hết các mô hình và logic trong appDelegate?

Tôi mới bắt đầu đọc một cuốn sách trên IOS, và tác giả dường như muốn đặt logic ứng dụng trong appDelegate và các trình điều khiển xem chỉ chuyển tiếp các hành động đến các phương thức appDelegate thực hiện công việc thực.

Tác giả chỉ làm điều này vì chúng là những ví dụ đơn giản, hay đây là điều tôi nên học và bắt đầu làm trong các ứng dụng của tôi?

+0

Tôi thích câu trả lời của LavaSlider tại đây http://stackoverflow.com/questions/8421138/importing-appdelegate – Rhubarb

Trả lời

12

Đầu tiên, xem What describes the Application Delegate best? How does it fit into the whole concept?

Các đại biểu ứng dụng là các đại biểu cho ứng dụng. Nó không phải là nơi để giữ tất cả mọi thứ bạn không biết nơi khác để đặt. Nó không phải là nơi lưu trữ cho globals. Nó là đại biểu cho đối tượng UIApplication. Vì vậy, nó là nơi thích hợp để đưa mã liên quan đến việc khởi động ứng dụng, kết thúc, chuyển đổi sang và từ nền, vv Những điều cần làm với ứng dụng phù hợp với hệ điều hành như thế nào.

Ứng dụng đại biểu là bộ điều khiển nên không được giữ dữ liệu. Dữ liệu đi vào mô hình. Ứng dụng đại biểu có thể tạo mô hình lúc khởi động và giao nó cho các bộ điều khiển khác, nhưng nó không phải là API cho mô hình. Thường thì mô hình là một singleton thay vì được tạo ra bởi các đại biểu ứng dụng. Cả hai cách tiếp cận đều có lợi thế.

Hầu hết mã ví dụ đặt mã mô hình trong ứng dụng đại biểu bởi vì đối với các ví dụ đơn giản, nó yêu cầu mã ít hơn một chút. Nhưng trong các chương trình thực sự nó làm cho ứng dụng ủy nhiệm quá phức tạp và gây tổn hại đáng kể cho việc tái sử dụng mã. Đại biểu ứng dụng của bạn thường phải là khá nhỏ và hầu hết các phương pháp trong đó phải là một phần của <UIApplicationDelegate>.

+0

Tôi muốn sử dụng managedObjectContext ở mọi nơi trong ứng dụng phụ thuộc dữ liệu cốt lõi của mình. Tôi không thể tìm thấy bất kỳ giải pháp nào khác mà nhập Appdelegate ở mọi nơi, để truy cập vào nó. Có cách nào khác không? – Nil

+1

Di chuyển 'managedObjectContext' sang một nơi nào đó không phải là ứng cử viên. Nó có thể là một singleton của riêng nó, hoặc nó có thể được tiêm vào các đối tượng yêu cầu nó. Cá nhân tôi tiêm nó vào các đối tượng mô hình cần nó, và để cho các bộ điều khiển xem tìm nạp nó thông qua một singleton 'ViewControllerServices'. Nhưng đó không phải là ứng cử viên. –

+0

Tôi có một singleton quản lý appstate (userinfo, cài đặt, tùy chọn người dùng khác). Tôi đã tạo một thuộc tính mạnh mẽ của managedObjectContext ở đó và khởi tạo điều này trong mã 'applicationDidFinishLaunching'. Luồng này có tối ưu không? Tôi có thể sử dụng managedObjectContext từ đây trong suốt ứng dụng! – Nil

3

Tôi sẽ nói đó là vì các ví dụ có thể đơn giản. Đối với bất kỳ ứng dụng thực tế phức tạp, phức tạp nào, lớp appdelegate sẽ sớm trở nên khó sử dụng.

3

Về mặt kỹ thuật, bạn có thể làm điều đó. Về mặt thực hành lập trình, thì không. Một khi bạn đặt rất nhiều thứ trong appDelegate, nó sẽ trở nên rất lộn xộn. Lời khuyên của tôi sẽ để nó một mình.

Bạn không cần đặt bất kỳ thứ gì vào appDelegate ngoại trừ biến toàn cầu. Và nếu bạn cần nó đôi khi, đề nghị của tôi sẽ được sử dụng một cái gì đó khác như mô hình singleton. Nói chung, các biến toàn cầu không phải là thực hành tốt.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan