Hiện tại tôi đang tự dạy lập trình iOS và một khái niệm tôi thấy thực sự khó khăn để quẩn quanh là sự ủy thác. Nó là gì? Tại sao và nó được sử dụng như thế nào? Lợi thế là gì? Các kỹ thuật viết từ cuốn sách tôi đang đọc làm cho nó khó hiểu.
Hiện tại tôi đang tự dạy lập trình iOS và một khái niệm tôi thấy thực sự khó khăn để quẩn quanh là sự ủy thác. Nó là gì? Tại sao và nó được sử dụng như thế nào? Lợi thế là gì? Các kỹ thuật viết từ cuốn sách tôi đang đọc làm cho nó khó hiểu.
Câu trả lời:
Để hiểu delegates
, bạn phải hiểu protocols
.
A protocol
giống như một hợp đồng dịch vụ. Khi một đối tượng (thường là một UIViewController
lớp con, nhưng không phải luôn luôn) ký hợp đồng đó, nó có nghĩa là "Tôi quan tâm đến việc cung cấp logic để sao lưu tin nhắn bạn gửi cho tôi". Điều này tương tự như NSNotificationCenter
liên quan đến việc đăng ký một mức độ quan tâm, sự khác biệt là một đối tượng sử dụng ủy quyền chỉ có thể có delegate
một lần, trong đó nhiều đối tượng có thể đăng ký giống nhau NSNotification
.
Apple sử dụng ủy quyền một cách phổ biến. Tuy nhiên, ngày càng nhiều hơn, bạn đang thấy Apple chuyển rất nhiều API của họ sang blocks
, tương tự như callbacks
trong các ngôn ngữ khác.
Điều đó đang được nói, ủy quyền giúp duy trì MVC, mặc dù tôi sẽ cho rằng ủy quyền là một mẫu thiết kế trong chính nó. Nó giúp tách các mô hình từ bộ điều khiển. Chẳng hạn như trong ví dụ của John Cartwright, UITableView
biết cách hiển thị các hàng và phần. Nó biết làm thế nào để sử dụng lại UITableViewCells
cho lý do hiệu suất. Nó biết tất cả những thứ khác a UIScrollView
biết. Nhưng nó không biết những tế bào nào sẽ hiển thị. Nó không biết những gì để đưa vào những tế bào. Nó không biết những tế bào nào sẽ sử dụng lại cho một cái nhất định NSIndexPath
. Điều này thực sự nên là công việc của bộ điều khiển, dù sao đi nữa. Phân quyền cho phép chế độ xem bảng giảm tải logic không xem này lên một đối tượng cần có trách nhiệm đó.
Hơn thế nữa, bạn không bị khóa trong một đại biểu trong toàn bộ vòng đời của một đối tượng. Bạn có thể rất dễ dàng có nhiều nguồn dữ liệu cho trước UITableView
và chuyển chúng xung quanh vào thời gian chạy khi cần thiết.
Vì vậy, một mặt, sự ủy nhiệm là tuyệt vời để cung cấp dữ liệu và phản hồi các tương tác từ một đối tượng. Bạn sẽ thấy nó trong rất nhiều lớp UIKit, một ví dụ UITableView
, UIPickerView
, UICollectionView
vv
Nhưng ủy nhiệm cũng rất hữu ích khi bạn muốn truyền thông tin giữa các đối tượng. Bạn có thể rất dễ dàng tạo các giao thức của riêng bạn và đăng ký các đối tượng của riêng bạn để theo dõi chúng. Hơn nữa, các phương thức giao thức @required
theo mặc định, nhưng bạn có thể chỉ định một số phương thức là@optional
. Điều này có thể cung cấp cho bạn một số linh hoạt tốt đẹp nếu bạn cần nó. Giả sử bạn có bộ điều khiển xem cha mẹ và bộ điều khiển xem con. Có lẽ bạn đang sử dụng API Ngăn chặn mới để làm điều này. Thông thường, nếu bạn cần truyền thông tin từ cha mẹ cho con, bạn làm điều này với một tài sản. Làm xong. Nhưng nếu bạn cần truyền thông tin từ trẻ trở lại cho cha mẹ thì sao? Có thể một cái gì đó thay đổi ở trẻ và bạn cần thông báo cho cha mẹ. Chắc chắn, bạn có thể làm một số KVO trên các giá trị nhất định. Nhưng có lẽ bạn muốn biết khi nhấn nút. Chỉ cần tạo một giao thức mới trong trình điều khiển khung nhìn con
@protocol MyChildDelegate
- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController;
@end
@interface MyChildViewController : UIViewController
@property (weak, nonatomic) id <MyChildDelegate> delegate;
@end
Trong MyChildViewCont kiểm soát, khi nhấn nút của bạn, chỉ cần kiểm tra xem đại biểu của bạn có trả lời tin nhắn đại biểu không (nếu cần và đại biểu của bạn không thực hiện phương thức, bạn sẽ gặp sự cố @optional
nếu bạn cần) và gửi nó:
- (IBAction)someButtonTapped:(id)sender {
if ([self.delegate respondsToSelector:@selector(buttonWasTappedInChild:)]) {
[self.delegate buttonWasTappedInChild:self];
}
}
Sau đó, đặt đại biểu của MyChildViewCont kiểm soát của bạn self
và triển khai - (void)buttonWasTappedInChild:(MyChildViewController *)childViewController
trong trình điều khiển xem cha mẹ của bạn. BÙM! Bạn có thông tin được truyền từ một đứa trẻ cho đến cha mẹ. Mối quan hệ giữa hai đối tượng thậm chí không cần phải gần gũi như cha mẹ / con cái. Đó là một hợp đồng dịch vụ, miễn là đối tượng đăng ký giữ được phần cuối của món hời bằng cách thực hiện các phương thức cần thiết, bạn là vàng!
LƯU Ý: Các đại biểu phải yếu / gán các thuộc tính, nếu không, bạn sẽ bước vào một chu kỳ giữ mà không đối tượng nào có thể được giải quyết.
Hi vọng điêu nay co ich!
Đại biểu là các đối tượng thực hiện các chức năng nhất định khi không thực hiện các chức năng đó trên đối tượng bình thường. Nó là một hình thức tiêm phụ thuộc.
Để biết ví dụ cụ thể, hãy xem giao thức UITableViewDelegate. Các phương thức này không có ý nghĩa đối với chế độ xem bảng để thực hiện trực tiếp, bởi vì các hành động chọn hàng xem bảng sẽ khác nhau trong mỗi ứng dụng và có thể trong mỗi chế độ xem bảng. Đại biểu có một phương thức -tableView:didSelectRowAtIndexPath:
để bạn có thể tạo một đối tượng xử lý lựa chọn hàng mà không cần phân lớp khung nhìn bảng cho mỗi hành động riêng biệt mà bạn muốn thực hiện.