2013-02-15 41 views
3

我正在寻找一个关于使用NSURLConnection异步请求的很好的教程。我一直在四处寻找和谷歌,但无法找到一个。这可以是这里数以万计的问题的重复。但是请直接给我正确的教程,我之前使用过ASIHTTPRequest,但我之前没有使用Apple提供的库。异步NSURLConnection计划教程

+0

是否有您不明白的特定部分?在核心,它只有几个方法... – jrturton 2013-02-15 20:34:22

+0

是的我想了解这个方法sendAsynchronousRequest:queue:completionHandler:所以我应该如何通知该请求已处理。这个completionHandler到底做了什么?这是正确处理异步请求的正确方法吗?或者是否有其他方法 – user2070420 2013-02-15 20:44:52

+0

是的,这样或委托方法,要么是好的。你熟悉块吗? – jrturton 2013-02-15 20:50:48

回答

6

我会为你提供一个写我自己,但我会强烈建议使用AFNetworking,它的NSURLConnection的/的NSURLRequest系统,该系统有一个更清洁的流量以上的包装,你也可以使用基本NSURLRequests /连接与此,随着常规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,因此您一定需要处理该问题,我通常只是构建扩展并使用performSelectorOnMainThread,但是更好的方法可能是将函数包装在dispatch_async中,并调用您在hud之外显示/隐藏代码那。

+0

感谢Holyprin,我知道AFNetworking和ASIHTTPRequest但是我不允许使用第三方库,这就是我试图从头开始的原因。所以,如果你为我提供你的教程,那将会很棒。 – user2070420 2013-02-15 20:22:15

+0

猜测是有道理的,我会在这里写一次。 – Holyprin 2013-02-15 20:35:13

+0

我如何通知我的用户界面,任务已完成说我正在下载一些图像,以自行更新。 – user2070420 2013-02-20 07:13:19