2009-09-05 40 views
38

Tôi đến từ mô hình sự kiện C# và tôi tự hỏi liệu có cách nào tiêu chuẩn để thông báo cho nhiều đại biểu của một sự kiện không?Nhiều đại biểu trong mục tiêu C

Tôi có giao thức ClassCDelegate mà tôi muốn cả ClassA và ClassB thực hiện. Có cách nào tôi có thể chỉ định một thể hiện của ClassC cả ClassA và ClassB là đại biểu mà không cần phải tự tạo một danh sách các biến đại biểu trong ClassC và lặp qua chúng?

Trả lời

73

Đạ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.

+1

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. –

+1

Đồ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. –

2

Bạn chỉ có thể có một đối tượng đại biểu. Nếu bạn muốn thông báo cho các đối tượng khác nhau về các thay đổi, bạn nên sử dụng NSNotificationCenter và đăng các thông báo NSNotification mà các đối tượng của bạn có thể nghe.

+9

Thực ra, đây là quy ước, nhưng không phải là giới hạn nghiêm ngặt. Mọi người đều có xu hướng chỉ nghĩ đến một phương thức 'setDelegate:', nhưng có sự linh hoạt không giới hạn. –

3

Bạn cũng có thể có một đối tượng xử lý sự kiện và sau đó chuyển tiếp đối tượng đó đến đối tượng thứ hai.

3

Điều quan trọng cần lưu ý là Thông báo là đường một chiều - Họ không thể gửi thông tin trở lại, vì đại biểu có thể. Trường hợp duy nhất mà bạn muốn lặp qua danh sách các đại biểu là nếu lớp ủy nhiệm của bạn trông đợi thông tin từ các đại biểu của nó.

1

Hãy thử MultiDelegate nó cho phép bạn chuyển tiếp các phương thức ủy nhiệm tới bất kỳ số lượng đối tượng đại biểu nào.

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