iPhone ASIHTTP - 区分API调用?

时间:2010-09-23 17:07:02

标签: iphone objective-c api asihttprequest

我目前有一个视图控制器,它实现ASIHTTP来处理API调用。

我的视图控制器触发2个单独的调用。我需要能够区分-requestFinished(ASIHTTPRequest *)请求方法中的2个调用,因此我可以相应地解析每个调用...

有没有这样做?

4 个答案:

答案 0 :(得分: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.
    }
}

在此视图控制器中为每个不同的ASIHTTPRequest中的键@"type"设置对象的不同值,现在您可以在-requestFinished:中区分它们并适当地处理它们。

如果您真的很喜欢,可以随身携带在请求完成时有用的任何其他数据。例如,如果您正在加载延迟图像,则可以向自己传递要填充的UIImageView的句柄,然后在加载图像数据后在-requestFinished中执行此操作!

答案 1 :(得分:1)

您可以检查传递给request方法的requestFinished:(ASIHTTPRequest *)request参数,以区分这两个电话。

例如,如果两个调用具有不同的URL,则可以检查request.url属性以区分这两个请求。

答案 2 :(得分:1)

您可以设置应在创建请求时调用的相应选择器:

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

为不同的电话设置不同的选择器

答案 3 :(得分:0)

您可以检查url / originalUrl属性,或者您可以对其进行子类化并添加您自己的属性以指示调用方式,因为比较字符串更容易/更快地比较整数。

myRequest.callType = FACEBOOK_LOGIN;

我在这个枚举中收到了所有的电话:

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