3

我正在寻找一个关于使用 NSURLConnection 异步请求的好教程。我一直在 stackoverflow 和 Google 中四处寻找,但找不到。这可能是无数这样的问题的副本。但是请指导我正确的教程,我之前使用过 ASIHTTPRequest,但我之前没有使用过 Apple 提供的库。

4

1 回答 1

6

我会为您提供自己编写的一个,但是我强烈建议使用AFNetworking,它是 NSURLConnection / NSURLRequest 系统之上的一个包装器,具有更清晰的流程,您还可以使用基本的 NSURLRequests / Connections 以及常规的 NSOperationQueues。图书馆还使用可可豆荚,老实说,你真的不能再那么干净了。

NSOperationQueue *mainQueue = [[NSOperationQueue alloc] init];
[mainQueue setMaxConcurrentOperationCount:5];

NSURL *url = [NSURL URLWithString:@"http://192.168.0.63:7070/api/Misc/GetFuelTypes"];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

[request setHTTPMethod:@"GET"];
[request setAllHTTPHeaderFields:@{@"Accepts-Encoding": @"gzip", @"Accept": @"application/json"}];

[NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
    NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response;
    if (!error) {
        NSLog(@"Status Code: %li %@", (long)urlResponse.statusCode, [NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]);
        NSLog(@"Response Body: %@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
    }
    else {
        NSLog(@"An error occured, Status Code: %i", urlResponse.statusCode);
        NSLog(@"Description: %@", [error localizedDescription]);
        NSLog(@"Response Body: %@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
    }
}];

mainQueue 对象用于路由请求并管理一次可以发送多少个请求。这可以用在很多方面,我倾向于将它们用于分类请求(身份验证、主要、上传队列)

一旦进入块内,您将使用返回的响应构建本地 NSHTTPURLResponse。如果您希望返回状态代码,则需要这样做。(不存在于标准 NSURLResponse 对象中)

responseData 是通常可以直接转换为字符串或通过反序列化器运行以获得人类可读数据的数据。

非常简单的解释,如果您不知道如何管理来自同一个对象的多个请求(可能是我更喜欢块的原因),代表会给您带来麻烦:-)

就像总是委托或阻止您希望在收到响应后触发您的 UI 进行更新,但不要等待请求完成,如果您将数据加载到表中,您将调用加载请求并提供某种形式进度 hud 告诉他们正在发出请求,一旦收到数据,您就移除 hud 并重新加载表数据。HUD 必须在主线程上调用,所以你肯定需要处理它,我通常只是构建扩展并使用 performSelectorOnMainThread,但是更好的方法可能是将你的函数包装在 dispatch_async 中并调用你是 hud 之外的显示/隐藏代码那。

于 2013-02-15T20:01:45.300 回答