iPhone ASIHTTP - Различают ли вызовы API? - PullRequest
5 голосов
/ 23 сентября 2010

В настоящее время у меня есть контроллер представления, который реализует ASIHTTP для обработки вызовов API.

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

Есть ли что-нибудь из этого?

Ответы [ 4 ]

9 голосов
/ 23 сентября 2010

Используйте поле 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 голос
/ 24 сентября 2010

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

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

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

1 голос
/ 23 сентября 2010

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

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

0 голосов
/ 23 сентября 2010

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

т.е.

myRequest.callType = FACEBOOK_LOGIN;

У меня все перечисления в перечислении такие:

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