2013-01-04 19 views
6

Mam klasę, która ma oparty na uczestniku system do wysyłania różnych typów żądań. używa delegata do poinformowania obiektu, gdy żądanie jest kompletne, a także, czy było sukcesem o błędzie.Jak przekonwertować oparty na uczestnikach system wywołań zwrotnych na blokowy?

Teraz muszę również sprawdzić, jaki rodzaj wniosku był w odpowiedzi na podjęcie odpowiednich działań.

Posiadam klasę wrapper, która powinna dać mi blokowy interfejs dla tego samego.

Przekaż blok zakończenia i blok błędu do metody żądania, która powinna wewnętrznie korzystać z tej klasy delegowanej.

A kiedy nadejdzie odpowiedź, powinien automatycznie wywołać odpowiedni moduł obsługi dla tego typu żądania oraz w zależności od sukcesu i błędu.

Widziałem podobne pytanie na SO, ale było to dla mnie trochę niejasne, więc proszę podać ogólne pojęcie, jak się do tego zabrać, zamiast oznaczać je jako duplikat od razu.

Odpowiedz

2

Oto jeden sposób, aby to zrobić. Użyj tej klasy RAExpendable, aby dynamicznie budować delegata z implementacją blokową.

Załóżmy, że pełnomocnik jest:

@protocol XDelegate 
-(void) foo:(id)response; 
@end 

Dodaj RAExpendable.h, RAExpendable.m z https://github.com/evadne/RAExpendable do projektu. Dynamicznie dodać metodę Delegat:

RAExpendable *expendable = [RAExpendable new]; 
    [expendable addMethodForSelector:@selector(foo:) types:"[email protected]:@" block:^(id x, SEL sel, id response){ 
     NSLog(@"response is %@", response); 
    }]; 

i ustawić klasę expendable jako delegat:

someObject.delegate = expendable; 

Teraz, jeśli to zrobić:

[expendable performSelector:@selector(foo:) withObject:@"OK"]; 

można uzyskać ciąg response is OK. Zastąp NSLog dowolną implementacją sukcesu/niepowodzenia, którą uznasz za stosowną. Odtąd, gdy wywołasz foo:, blok zostanie wykonany zamiast tego.

Jeśli chcesz zmodyfikować to dla swojego przypadku użycia, zwróć uwagę, że parametrami tego przykładu były [email protected]:@, które zgodnie z instrukcją środowiska wykonawczego Type Encoding oznaczają: void return, self, SEL, object. self i SEL są dwoma ukrytymi parametrami występującymi w każdej metodzie Objective-C, trzeci parametr jest pierwszym niewidocznym parametrem metody. Podpis bloku musi być zgodny z podpisem metody.

+0

Wszelkie przykład dla wielu argumentów? Otrzymuję tę wiadomość również podczas przypisywania 'RAExpendable' jako delegata:' Przypisywanie do 'id ' z niekompatybilnego typu 'RAExpendable * __ strong'' – atulkhatri

2

Z REKit, można dokonać delegata dynamicznie jak poniżej:

id dynamicDelegate; 
dynamicDelegate = [[NSObject alloc] init]; 
[dynamicDelegate respondsToSelector:@selector(foo:) withKey:nil usingBlock:^(id receiver, id response) { 
    NSLog(@"response is %@", response); 
}]; 
someObject.delegate = dynamicDelegate; 
+0

Działa dla mnie. I doceniam to, że nie muszę samodzielnie rozgryźć obiektów w Objective-C! – EthanB

+0

P.S. @Kazki, zapomniałeś dodać "disclaimer autorstwa". ;) – EthanB

Powiązane problemy