Đại biểu cacao được sử dụng để thực hiện đảo ngược kiểm soát và làm giảm nhu cầu phân lớp phụ. Nó hoàn toàn có thể có nhiều đại biểu cho một đối tượng duy nhất, nhưng điều này được thực hiện khi có ý nghĩa để ủy quyền các loại quyết định khác nhau cho các đối tượng khác nhau. Một ví dụ tuyệt vời về điều này là WebView
từ WebKit, trong đó có năm đại biểu chịu trách nhiệm về các lĩnh vực đa dạng như tải tài nguyên và chính sách điều hướng.
Hệ thống phân bổ sự kiện của C#, cho phép đối tượng đăng ký với đối tượng khác để được thông báo khi có sự kiện cụ thể, gần nhất với một số API thông báo có sẵn từ Cocoa. Các API khác nhau mà bạn có thể chạy qua là, từ cấp cao nhất đến thấp nhất:
NSNotificationCenter
NSDistributedNotificationCenter
CFNotificationCenter
- thông báo Darwin.
Tất cả đều tương tự về tinh thần, vì vậy, tôi chỉ xem xét trường hợp bạn sử dụng trong trường hợp này: NSNotificationCenter
.
Các nhà quan sát, chẳng hạn như ClassA và ClassB, đăng ký sở thích của họ trong thông báo với NSNotificationCenter
. Họ có thể chỉ định một quan tâm đến
- thông báo với một tên cụ thể từ một đối tượng cụ thể
- thông báo với một tên cụ thể từ bất kỳ đối tượng
- thông báo từ một đối tượng cụ thể.
Khi thông báo trùng khớp được đăng lên trung tâm thông báo, người quan sát được thông báo bằng cách gọi phương thức mà họ đã cung cấp vào thời điểm đăng ký với trung tâm thông báo. Phương thức luôn có cùng kiểu: nó không trả về gì và chấp nhận một đối số đơn lẻ, một đối tượng NSNotification
.
Bạn thường sẽ xử lý tình huống của bạn bằng việc có ClassC tuyên bố một hằng số cho tên thông báo trong tập tin tiêu đề của nó, ví dụ,
extern NSString *const ClassCSomethingDidHappenNotification;
quan sát quan tâm, chẳng hạn như ClassA và ClassB, sau đó có thể đăng ký quan tâm này thông báo:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleSomethingDidHappen:)
name:ClassCSomethingDidHappenNotification
object:aClassCObject];
Thay vì đăng ký một chọn và thêm một phương pháp để người quan sát để xử lý các cuộc gọi lại, bạn cũng có thể đăng ký tại một hàng đợi hoạt động và một khối để thực hiện trên hàng đợi rằng khi một thông báo phù hợp được đăng.
Khi sự kiện liên quan đến việc thông báo xảy ra, ClassC bài gửi thông báo đến các trung tâm thông báo:
[[NSNotificationCenter defaultCenter]
postNotificationName:ClassCSomethingDidHappenNotification
object:self];
Các trung tâm thông báo sau đó sẽ xem xét thông qua danh sách các nhà quan sát, tìm những người phù hợp với thông báo này, và gọi phương pháp thích hợp.
Giới thiệu tuyệt vời về các thông báo và sự tương đồng và khác biệt của chúng với các đại biểu. –
Đồng ý, đây là một sự định hướng tuyệt vời của các đại biểu và thông báo (người nghe). Đó là một phần của một dòng mờ (ví dụ, chúng ta thường thông báo cho các đại biểu về việc hoàn thành các nhiệm vụ không đồng bộ) nhưng nó trả tiền để hiểu sự khác biệt. –