English site
  • Objective-C: Delegati

    Objavio: Luka Gabric, 15. 04. 2010. u kategoriji iPhone development

    delegate

    Delegacija predstavlja uzorak koji je često korišten u objektno orijentiranom programiranju. Koristi se u slučajevima kada glavni objekt predaje određeni zadatak pomoćnom objektu koji će taj zadatak izvršiti i rezultatom obavijestiti glavni objekt. U ovom se slučaju pomoćni objekt naziva delegatom.

    Primjena delegata predstavljena je jednostavnim problemom zbrajanja dva cijela broja. Pretpostavimo da klasa, čija će instanca predstavljati glavni objekt, želi prepustiti rješavanje problema zbrajanja dvaju brojeva nekoj drugoj klasi. Instanca te druge klase predstavljat će delegata.

    U glavnoj bi se klasi delegat mogao stvoriti na sljedeći način:

    KlasaDelegata *mojDelegat;
    mojDelegat = [[KlasaDelegata alloc] glavnaKlasa:self
                                           prviBroj:a
                                          drugiBroj:b
                                             metoda:@selector(delegatJeIzracunaoSumu:)];

    Objekt pod nazivom mojDelegat stvara se s parametrima koji su potrebni za komunikaciju između delegata i glavnog objekta. U ovom se slučaju delegat stvara s parametrima instance glavne klase (self), parametrima  za izračunavanje (a i b) te metodom koja se treba pozvati nakon što se izračuna suma (delegatJeIzracunaoSumu).

    Glavna klasa definira metodu delegatJeIzracunaoSumu koju delegat poziva nakon izračunavanja sume.

    - (void) delegatJeIzracunaoSumu:(NSNumber *)suma
    {
       NSLog(@"Delegat je izračunao: %d + %d = %d", a, b, [suma intValue]);
    }

    Delegat sadrži konstruktor definiran na sljedeći način:

    - (id) glavnaKlasa:(id)glavniObjekt
              prviBroj:(int)a
             drugiBroj:(int)b
                metoda:(SEL)metodaGlavneKlase
    {
       self = [super init];
       if (self != nil)
       {
          if ( [glavniObjekt respondsToSelector:metodaGlavneKlase] )
          {
             NSNumber *suma = [NSNumber numberWithInt:(a + b)];
             [glavniObjekt performSelector:metodaGlavneKlase withObject:suma];
          }
       }
       return self;
    }

    U konstruktoru delegat prima parametre potrebne za izvršavanje zadatka. Nakon što se izvrši inicijalizacija delegata, provjerava se sadrži li objekt selektor, odnosno navedenu metodu – metodaGlavneKlase.

    if ( [glavniObjekt respondsToSelector:metodaGlavneKlase] )

    U slučaju da metoda postoji izračunava se suma.

    NSNumber *suma = [NSNumber numberWithInt:(a + b)];

    Kada delegat sadrži sve informacije koje su potrebne glavnom objektu, u ovom slučaju izračunatu sumu, izvršava se selektor, odnosno metoda s parametrom tj. objektom sume.

    [glavniObjekt performSelector:metodaGlavneKlase withObject:suma];
  • Leave a Reply