2012-01-28 27 views
10

Tôi chỉ thực sự bắt đầu phát triển IOS nhưng có một vài năm phát triển ASP.net thông qua C#. Thành thật mà nói, tôi chưa bao giờ có nhu cầu thực sự để hiểu đại biểu/sự kiện, v.v. trước đây, tôi biết rằng tôi đang sử dụng chúng khi lập trình web.forms nhưng rất nhiều chức năng được quản lý bởi khung công tác, đằng sau hậu trường . Vì vậy, bây giờ tôi đang phát triển trong IOS, tôi buộc phải cố gắng hiểu làm thế nào họ hoạt động (Tôi giả sử ở đây rằng lý thuyết của các đại biểu/sự kiện là như nhau trên các ngôn ngữ, có lẽ tôi là sai). Dù sao, các dòng mã sau đây trong IOS:Đại biểu trong IOS - Một số yêu cầu làm rõ

if ([self.delegate respondsToSelector:@selector(startImporting:)]) 
{ 
      [self.delegate startImporting:self]; 
} 

Tôi có ngay trong suy nghĩ rằng, trong mã giả, nó có nghĩa là một cái gì đó dọc theo dòng:

Nếu phương pháp/lớp gọi phương pháp này có một phương thức trong nó được gọi là 'startImporting', sau đó gọi phương thức 'startImporting' trong lớp gọi.

Hy vọng điều đó rõ ràng. Nếu đó là trường hợp sau đó nó về cơ bản sẽ được giống như có một phương pháp tĩnh trong C# mà bạn có thể gọi với một cái gì đó như:

myImportClass.startImporting(); 

Có lẽ không, hay đó là cách nó sẽ được thực hiện. Vì vậy, tôi thiếu toàn bộ điểm của các đại biểu, lợi ích của họ, vv? Tôi đã đọc những gì họ hơn và hơn và trong khi nó có ý nghĩa, nó không bao giờ nhấp chuột, tôi không bao giờ (trong các hình thức web anyway) đã thực sự nhìn thấy lợi ích của việc sử dụng chúng. Điều này trở nên ngày càng quan trọng khi tôi chuyển sang sử dụng các biểu thức lambda trong .net và chúng được liên kết chặt chẽ với các đại biểu trong C# vì vậy trong khi tôi chỉ có thể bắt đầu sử dụng chúng, tôi muốn biết tại sao và các đại biểu có lợi ích gì thực sự là.

+0

đây http://stackoverflow.com/questions/30662032/ios-callback-function -từ thư viện, bạn có thể tìm thấy chi tiết triển khai cho các đại biểu. –

Trả lời

45

Các mô hình đoàn trong ca cao được sử dụng để thông báo cho (tiến bộ báo cáo, vv .) hoặc truy vấn (yêu cầu thông tin đăng nhập, v.v.) một đối tượng khác mà không biết nhiều về nó.

Thông thường, bạn sử dụng giao thức để xác định phương thức bạn sẽ gọi trên đại biểu và đại biểu sau đó cần phải tuân theo giao thức đó. Bạn cũng có thể thêm các phương thức mà đại biểu không cần thực hiện (tùy chọn). Khi bạn làm như vậy, bạn sẽ phải gọi -respondsToSelector :, bởi vì bạn không biết liệu đại biểu có muốn phương thức cụ thể được gọi hay không.

Ví dụ:
Bạn có lớp sản xuất thứ gì đó, hãy gọi số Machine và nhân viên của lớp Worker.Máy cần phải được điều chỉnh cho nhiệm vụ:

Machine *machine = [[Machine alloc] init]; 
[machine prepareWithParameters:myParameters]; 

Bây giờ chúng ta có máy chúng tôi muốn tạo ra một số lượng lớn các Stuff:

[machine produceStuff]; 

Được rồi, chúng ta đã hoàn tất. Nhưng làm thế nào để chúng ta biết khi nào một đơn vị của Stuff đã được sản xuất? Chúng ta có thể có nhân viên của chúng tôi liên tục đứng bên cạnh máy của chúng tôi và chờ đợi:

while (![machine isFinished]) { 
    if ([machine didProduceStuff]) { 
     Stuff *stuff = [machine producedStuff]; 
     [self doSomethingWithStuff:stuff]; 
    } 
    else { 
     // Get a very large coffee... 
    } 
} 

Nó sẽ không thể tuyệt vời nếu máy đã thông báo cho chúng tự động, khi nó được thực hiện với sản xuất một đơn vị của Stuff?

@protocol MachineDelegate <NSObject> 
@optional 
    - (void) machine:(Machine *)machine didProduceStuff:(Stuff *)stuff; 
@end 

Hãy thêm worker như một đại biểu của machine:

Worker *worker; 
Machine *machine = [[Machine alloc] init]; 
[machine prepareWithParameters:myParameters]; 
[machine setDelegate:worker]; // worker does conform to <MachineDelegate> 

[machine produceStuff]; 

Khi Machine được thực hiện sản xuất cái gì đó, nó sẽ sau đó gọi:

if ([[self delegate] respondsToSelector:@selector(machine:didProduceStuff:)]) 
    [[self delegate] machine:self didProduceStuff:stuff]; 

Các worker sau đó sẽ nhận được phương pháp này và có thể làm điều gì đó:

- (void) machine:(Machine *)machine didProduceStuff:(Stuff *)stuff { 
    [self doSomethingWithStuff:stuff]; 
    if ([machine isFinished]) 
     [self shutDownMachine:machine]; 

}

Nhân viên đó có hiệu quả hơn và dễ dàng hơn không? Bây giờ anh ta có thể làm điều gì đó hiệu quả hơn đứng bên cạnh máy trong khi máy vẫn đang sản xuất. Bây giờ bạn có thể thêm các phương pháp thậm chí nhiều hơn để MachineDelegate:

@protocol MachineDelegate <NSObject> 
@required 
    - (void) machineNeedsMaintenance:(Machine *)machine; 
    - (void) machine:(Machine *)machine fatalErrorOccured:(Error *)error; 
    - (BOOL) machine:(Machine *)machine shouldContinueAfterProductionError:(Error *)error; 
@optional 
    - (void) machineDidEnterEcoMode:(Machine *)machine; 
    - (void) machine:(Machine *)machine didProduceStuff:(Stuff *)stuff; 
@end 

Các đại biểu cũng có thể được sử dụng để thay đổi hành vi của một đối tượng mà không subclassing nó:

@protocol MachineDelegate <NSObject> 
@required 
    - (Color *) colorForStuffBeingProducedInMachine:(Machine *)machine; 
    - (BOOL) machineShouldGiftWrapStuffWhenDone:(Machine *)machine; 
@end 

Tôi hy vọng tôi có thể giúp bạn hiểu được lợi ích của trừu tượng mã của bạn bằng cách sử dụng các đại biểu một chút.

+2

Câu trả lời hoàn toàn toàn diện. Cảm ơn bạn! –

+2

Tuyệt vời! bắt đầu hiểu các đại biểu sau khi đọc câu trả lời này :) –

+0

Đây là ví dụ đại diện khách quan-c tốt nhất mà tôi đã gặp cho đến nay –

1

Hiểu mô hình MVC và việc sử dụng các Giao thức và thông báo là rất quan trọng để nắm bắt được mục đích sử dụng và mục đích của các đại biểu. Hãy coi chúng như những loại người phản ứng cho các sự kiện khác nhau liên quan đến một hành động cụ thể.

Hera là một số liên kết hữu ích trong Stackoverflow:

Hy vọng nó giúp

0

đại biểu rất hữu ích trong việc callbacks từ lớp khác

vậy tại sao phải sử dụng đại biểu: đó là chúng ta gọi là một phương pháp trên một lớp học ... đó là bình thường ... nếu chúng ta muốn lớp được thuyết minh để cho chúng tôi gọi lại ... đó là nơi các đại biểu có ích ...

ví dụ đơn giản: u tải xuống bài hát từ trang web sử dụng phương thức trên một lớp khi lớp hoàn tất tải xuống u muốn lớp cho bạn biết .. .

//protocol declaration 
    @protocol DownloadProtocol <NSObject> 
    -(void)OnFinish; 
    @end 

//SOng download class 
@interface songs 
@property(Strong,nonatomic) id<DownloadProtcol> delegate; 
-(void)Download; 
@end 
@implementation songs 
-(void)Download 
{ 

///the code to download goes here 

[self callTheCallingClass]; 

} 

-(void)CallTheCallingClass 
{ 
[self.delegate OnFinish]; 
} 
@end 

// 
@interface mainclass<DownloadProtocol> 

@end 

@implementation mainclass 

-(void)viewDidload 
{ 
Songs *s=[[SOngs alloc]init]; 
s.delegate=self; 
[s download]; 
} 
-(void)OnFinish 
{ 
    NSlog(@"Called"); 
} 
@end 

1) thấy đoàn được thực hiện thông qua giao thức trong mục tiêu c Tôi nghĩ rằng u có thể hiểu được cú pháp của nó ...

2) Trong lớp bài hát chúng ta tạo ra một tài sản cho giao thức đó chúng tôi giữ nó loại như ID ... bcuz loại không được biết tại thời gian biên dịch.

3) trong lớp bài hát khi chúng tôi hoàn tất tải xuống, chúng tôi gọi phương thức giao thức ...

4) Trong lớp học chính đầu tiên chúng tôi áp dụng các giao thức cú pháp lớp ở trên là cú pháp đó

5), chúng tôi nhanh chóng lớp bài hát

6) sau đó gán đối tượng lớp học chính (tự) ủy của lớp ca khúc

7) thì chúng ta phải áp dụng các lớp giao thức trong .m bằng cách thêm tên phương thức từ giao thức

8) như vậy từ giờ trở đi bất cứ khi nào bài hát lớp gọi phương thức giao thức thông qua biến thể hiện ủy nhiệm .... ra protocl phương pháp áp dụng trên lớp học chính được chạy

thử mã này hy vọng nó sẽ giúp ...

nếu u muốn biết thêm về chủ đề này google nó như đại biểu design pattern

các benifit chính là nó thúc đẩy sự lỏng lẻo lập trình ...

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