2010-09-23 1 views
5

В настоящее время у меня есть контроллер вида, который реализует ASIHTTP для обработки вызовов API.iPhone ASIHTTP - Различия между вызовами API?

Контроллер My view запускает 2 отдельных вызова. Мне нужно уметь различать два вызова в методе запроса -requestFinished (ASIHTTPRequest *), поэтому я могу разобрать каждый из них соответственно ...

Есть ли какие-либо из этих действий?

ответ

9

Используйте поле USERINFO! Вот для чего это!

Объект ASIHTTPRequest (или ASIFormDataRequest) имеет свойство, называемое .userInfo, которое может взять NSDictionary с чем-нибудь в нем, которое вы хотите. Так что я почти всегда иду:

- (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. 
    } 
} 

Установите другое значение для объекта в ключевых @"type" в каждом другом ASIHTTPRequest вы делаете в этой точке зрения контроллера, и теперь вы можете различать их в -requestFinished: и обрабатывать каждый из них соответствующим образом ,

Если вы действительно любите, вы можете переносить любые другие данные, которые были бы полезны, когда запрос завершится. Например, если вы работаете с ленивыми изображениями, вы можете передать себе дескриптор UIImageView, который хотите заполнить, а затем сделать это в -requestFinished после загрузки данных изображения!

1

Вы можете проверить параметр request, переданный вашему методу requestFinished:(ASIHTTPRequest *)request, чтобы провести различие между двумя вызовами.

Например, если два вызова имеют разные URL-адреса, вы можете проверить свойство request.url, чтобы различать два запроса.

0

Вы можете проверить свойства url/originalUrl, или вы можете подклассифицировать его и добавить свое собственное свойство, чтобы указать, как я это делаю, потому что проще или быстрее сравнивать ints, чем строки.

т.е.

myRequest.callType = FACEBOOK_LOGIN; 

У меня есть все звонки в перечисление, как это:

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

Вы можете установить соответствующие селекторы, которые должны быть вызваны при создании запроса:

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

Просто набор различных селекторов для различных вызовов