Sunday, November 18, 2012

Vấn đề về delegate??

Click here...
Delegate dịch nghĩa ra thì là người được ủy nhiệm.
Ví dụ thế này, sếp bạn cử bạn đi công tác nước ngoài. Nhưng quyền quyết định mọi việc ko phải ở bạn mà là ở sếp. Ví dụ như bạn muốn ký hợp đồng, phá vỡ hợp đồng hay ko thì phải là do sếp quyết định. Vấn đề nảy sinh ra là khi bạn ra nước ngoài, sếp bạn sẽ ko biết có chuyện gì nảy sinh ra hay ko để biết lúc nào mà ra quyết định. Còn nếu sếp cứ phải kè kè bên cạnh bạn thì việc cử bạn đi là vô ích. Để giải quyết vấn đề, sếp ủy nhiệm 1 vật đi theo bạn, và khi có việc gì, bạn chỉ cần thông báo qua vật này thì sếp sẽ biết. Ở đây vật này có thể là 1 số điện thoại liên lạc. số điện thoại liên lạc này chính là vật được ủy nhiệm, delegate.
Viết kiểu code thì thế này
Trong class ông chủ:

Nhanvien* a=[self luachonNhanVien];
a.solienlac_delegate=self;
[a dicongtac];

//---->Example-----
protocolTest = [[ClassWithProtocol alloc] init];
    [protocolTest setDelegate:self];
    //or--> protocolTest.delegate=self;
    [protocolTest startSomeProcess];

//-------------------

Trong class nhanvien:
-(void) dicongtac{
//Lam gi thi lam,
//lam xong thi thong bao ve cho ong chu de ong chu quyet dinh
[self.solienlac_delegate baocaosep:ketqua]
}



//------Example------
-(void)startSomeProcess
{
    NSLog(@"---->startSomeProcess!");
   
    [self.delegate processSuccessful:@"HELLO OBJC"]; //Bao cao lai cho sep!
 }
//----------------------

ông chủ sẽ phải comfort cái protocol của delegate, nghĩa là đảm bảo khi được gọi thì sẽ xử lý, nghĩa là cần có function này:
-(void) baocaosepint) ketqua{
if(ketqua==1)
[self goinhanvienve];
if(ketqua==2)
[self ralenhmoichonhanvien];
}
//-----Tai class ong chu, ong chu se quyet dinh lam di voi cai bao cao do cua nhan vien-----
- (void) processSuccessful:(NSString *) success
{
    NSLog(@"Process completed-->%@", success);
}
//---------------------------

Cốt lõi của vấn đề ở đây là CallBack function, hàm gọi ngược, chứ ko phải là trao đổi dữ liệu gì như 1 số bạn nói. Ở đây nhân viên có thể gọi ngược lại, yêu cầu sếp ra quyết định vì nhân viên đã có vật ủy nhiệm của sếp.
Trong C, C++, để thực hiện việc gọi ngược, người ta dùng function pointer.
Trong C#, người ta cũng gọi nó là delegate nhưng delegate này vai trò tương đương với function pointer của C, C++.
Trong java, người ta ko gọi là delegate, nhưng thực chất cũng là truyền 1 object ủy nhiệm tương tự như delegate của objective C mà thôi. Khác biệt với C,C++,C# ở chỗ delegate của Objective C sẽ có thể chứa nhiều functions

No comments:

Post a Comment