2010-09-23 3 views
5

Mam obecnie kontroler widoku, który implementuje ASIHTTP do obsługi wywołań API.iPhone ASIHTTP - Rozróżnianie wywołań API?

Mój kontroler widoku odpala 2 oddzielne połączenia. Muszę być w stanie rozróżnić 2 wywołania w żądanej metodzie żądania "Żądanie" (ASIHTTPRequest *), więc mogę odpowiednio przeanalizować każdy z nich ...

Czy jest coś takiego?

Odpowiedz

9

użyć pola userinfo! Po to jest to!

Obiekt ASIHTTPRequest (lub ASIFormDataRequest) ma właściwość o nazwie .userInfo, która może pobrać NSDictionary z dowolną zawartością. Więc prawie zawsze iść:

- (void) viewDidLoad { // or wherever 
    ASIHTTPRequest *req = [ASIHTTPRequest requestWithUrl:theUrl]; 
    req.delegate = self; 
    req.userInfo = [NSDictionary dictionaryWithObject:@"initialRequest" forKey:@"type"]; 
    [req startAsynchronous]; 
} 

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    if ([[request.userInfo valueForKey:@"type"] isEqualToString:@"initialRequest"]) { 
     // I know it's my "initialRequest" .req and not some other one! 
     // In here I might parse my JSON that the server replied with, 
     // assemble image URLs, and request them, with a userInfo 
     // field containing a dictionary with @"image" for the @"type", for instance. 
    } 
} 

ustawić inną wartość dla obiektu w kluczowych @"type" w każdym innym ASIHTTPRequest zrobić w tym kontrolerze widoku, i obecnie można je rozróżnić w -requestFinished: i obsłużyć każdy z nich odpowiednio .

Jeśli naprawdę masz ochotę, możesz zabrać ze sobą inne dane, które mogą się przydać, gdy żądanie się zakończy. Na przykład, jeśli ładujesz leniwy obraz, możesz przekazać sobie uchwyt do UIImageView, który chcesz zapełnić, a następnie zrobić to w -requestFinished po załadowaniu danych obrazu!

1

Możesz sprawdzić parametr request przekazany do swojej metody w celu rozróżnienia dwóch połączeń.

Na przykład, jeśli te dwie rozmowy mają różne adresy URL, możesz sprawdzić właściwość request.url, aby rozróżnić te dwie prośby.

0

Możesz sprawdzić właściwości url/originalUrl LUB możesz je podklasować i dodać własną właściwość, aby wskazać, jak to zrobić, ponieważ porównywanie intów jest łatwiejsze/szybsze niż ciągi.

tj

myRequest.callType = FACEBOOK_LOGIN; 

Mam wszystkie połączenia w enum tak:

enum calls { 
FACEBOOK_LOGIN = 101, 
FACEBOOK_GETWALL = 102, 
... 
} 
1

Można ustawić odpowiednie selektorów, które powinno zostać zwołane w tworzeniu żądanie:

[request setDelegate: self]; 
[request setDidFailSelector: @selector(apiCallDidFail:)]; 
[request setDidFinishSelector: @selector(apiCallDidFinish:)]; 

Wystarczy ustawić różnych selektorów dla różnych połączeń