一坎怪、如何選擇AFNetworking版本
此文章基于AFNetworking2.0
首先得下載AFNetworking庫文件,下載時得首先弄清楚廓握,你將要開發(fā)的軟件兼容的最低版本是多少搅窿。AFNetworking 2.0或者之后的版本需要xcode5.0版本并且只能為IOS6或更高的手機(jī)系統(tǒng)上運(yùn)行。如果開發(fā)MAC程序隙券,那么2.0版本只能在MAC OS X 10.8或者更高的版本上運(yùn)行
AFNetworking 2.0的下載地址https://github.com/AFNetworking/AFNetworking
二块差、獲取網(wǎng)絡(luò)請求
1、如何通過URL獲取json數(shù)據(jù)
1>剥懒、利用AFJSONRequestOperation虫溜,官方網(wǎng)站上給的例子:
NSString *str=[NSString stringWithFormat:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
? ? NSURL *url = [NSURL URLWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
? ? NSURLRequest *request = [NSURLRequest requestWithURL:url];
? ? //? ? 從URL獲取json數(shù)據(jù)
? ? AFJSONRequestOperation *operation1 = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSDictionary* JSON) {
? ? ? ? ? ? ? ? NSLog(@"獲取到的數(shù)據(jù)為:%@",JSON);
? ? } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id data) {
? ? ? ? NSLog(@"發(fā)生錯誤!%@",error);
? ? }];
? ? [operation1 start];
2>牲迫、利用AFHTTPRequestOperation?先獲取到字符串形式的數(shù)據(jù)耐朴,然后轉(zhuǎn)換成json格式,將NSString格式的數(shù)據(jù)轉(zhuǎn)換成json數(shù)據(jù)盹憎,利用IOS5自帶的json解析方法:
NSString *str=[NSString stringWithFormat:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
? ? NSURL *url = [NSURL URLWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
? ? NSURLRequest *request = [NSURLRequest requestWithURL:url];
? AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];
? ? [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, idresponseObject) {
? ? ? ? NSString *html = operation.responseString;
? ? ? ? ? ? NSData* data=[html dataUsingEncoding:NSUTF8StringEncoding];
? ? ? ? ? ? id dict=[NSJSONSerialization? JSONObjectWithData:data options:0 error:nil];
? ? ? ? NSLog(@"獲取到的數(shù)據(jù)為:%@",dict);
? ? }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
? ? ? ? NSLog(@"發(fā)生錯誤筛峭!%@",error);
? ? }];
? ? NSOperationQueue *queue = [[NSOperationQueue alloc] init];
? ? [queue addOperation:operation];
如果發(fā)生Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x14defc80 {NSUnderlyingError=0x14deea10 "bad URL", NSLocalizedDescription=bad URL這個錯誤,請檢查URL編碼格式陪每。有沒有進(jìn)行stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding
2影晓、如何通過URL獲取圖片
異步獲取圖片,通過隊列實(shí)現(xiàn)奶稠,而且圖片會有緩存俯艰,在下次請求相同的鏈接時,系統(tǒng)會自動調(diào)用緩存锌订,而不從網(wǎng)上請求數(shù)據(jù)竹握。
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 100.0f, 100.0f, 100.0f)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"]placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];?
?[self.view addSubview:imageView];
上面的方法是官方提供的,還有一種方法辆飘,
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.scott-sherwood.com/wp-content/uploads/2013/01/scene.png"]];
? ? AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse*response, UIImage *image) {
? ? ? ? self.backgroundImageView.image = image;
? ? } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
? ? ? ? NSLog(@"Error %@",error);
? ? }];
? ? [operation start];
如果使用第一種URLWithString:??placeholderImage:會有更多的細(xì)節(jié)處理啦辐,其實(shí)實(shí)現(xiàn)還是通過AFImageRequestOperation處理谓传,可以點(diǎn)擊URLWithString:??placeholderImage:方法進(jìn)去看一下就一目了然了。所以我覺得還是用第一種好芹关。
3续挟、如何通過URL獲取plist文件
通過url獲取plist文件的內(nèi)容,用的很少侥衬,這個方法在官方提供的方法里面沒有诗祸。
NSString *weatherUrl = @"http://www.calinks.com.cn/buick/kls/Buickhousekeeper.plist";
? ? NSURL *url = [NSURL URLWithString:[weatherUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
? ? NSURLRequest *request = [NSURLRequest requestWithURL:url];
? ? [AFPropertyListRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/plain"]];
? ? AFPropertyListRequestOperation *operation = [AFPropertyListRequestOperation propertyListRequestOperationWithRequest:request success:^(NSURLRequest *request,NSHTTPURLResponse *response, id propertyList) {
? ? ? ? NSLog(@"%@",(NSDictionary *)propertyList);
? ? }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, idpropertyList) {
? ? ? ? NSLog(@"%@",error);
? ? }];
? ? [operation start];
4、如何通過URL獲取XML數(shù)據(jù)
xml解析使用AFXMLRequestOperation轴总,需要實(shí)現(xiàn)蘋果自帶的NSXMLParserDelegate委托方法直颅,XML中有一些不需要的協(xié)議格式內(nèi)容,所以就不能像json那樣解析怀樟,還得實(shí)現(xiàn)委托功偿。我之前有想過能否所有的XML鏈接用一個類處理,而且跟服務(wù)端做了溝通往堡,結(jié)果很不方便械荷,效果不好。XML大多標(biāo)簽不同虑灰,格式也不固定吨瞎,所以就有問題,使用json就要方便的多瘩缆。
第一步:在.h文件中加入委托NSXMLParserDelegate
第二步:在.m文件方法中加入代碼
NSURL *url = [NSURL URLWithString:@"http://113.106.90.22:5244/sshopinfo"];
? ? NSURLRequest *request = [NSURLRequest requestWithURL:url];
? ? AFXMLRequestOperation *operation =
? ? [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest*request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
? ? ? ? XMLParser.delegate = self;
? ? ? ? [XMLParser setShouldProcessNamespaces:YES];
? ? ? ? [XMLParser parse];
? ? }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser*XMLParser) {
? ? ? ? NSLog(@"%@",error);
? ? }];
? ? [operation start];
第三步:在.m文件中實(shí)現(xiàn)委托方法?//在文檔開始的時候觸發(fā)
(void)parserDidStartDocument:(NSXMLParser *)parser{
? ? NSLog(@"解析開始!");
}
//解析起始標(biāo)記
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary*)attributeDict{
? ? NSLog(@"標(biāo)記:%@",elementName);
}
//解析文本節(jié)點(diǎn)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
? ? NSLog(@"值:%@",string);
}
//解析結(jié)束標(biāo)記
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
? ? NSLog(@"結(jié)束標(biāo)記:%@",elementName);
}
//文檔結(jié)束時觸發(fā)
-(void) parserDidEndDocument:(NSXMLParser *)parser{
? ? NSLog(@"解析結(jié)束庸娱!");
}
5谐算、如何使用AFHTTPClient進(jìn)行web service操作
AFHTTPClient處理GET 和 POST請求.做網(wǎng)頁的朋友們這個方法用的比較多。在要經(jīng)常調(diào)用某個請求時洲脂,可以封裝,節(jié)省資源恐锦。
? BaseURLString = @"http://www.raywenderlich.com/downloads/weather_sample/";
? ? NSURL *baseURL = [NSURL URLWithString:[NSString stringWithFormat:BaseURLString]];
? ? NSDictionary *parameters = [NSDictionary dictionaryWithObject:@"json" forKey:@"format"];
? ? AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
? ? [client registerHTTPOperationClass:[AFJSONRequestOperation class]];
? ? [client setDefaultHeader:@"Accept" value:@"text/html"];
? ? [client postPath:@"weather.php" parameters:parameters success:^(AFHTTPRequestOperation*operation, id responseObject) {
? ? ? ? NSString* newStr = [[NSString alloc] initWithData:responseObjectencoding:NSUTF8StringEncoding];
? ? ? ? NSLog(@"POST請求:%@",newStr);
? ? }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
? ? ? ? NSLog(@"%@",error);
? ? }];
? ? [client getPath:@"weather.php" parameters:parameters success:^(AFHTTPRequestOperation*operation, id responseObject) {
? ? ? ? NSString* newStr = [[NSString alloc] initWithData:responseObjectencoding:NSUTF8StringEncoding];
? ? ? ? NSLog(@"GET請求:%@",newStr);
? ? }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
? ? ? ? NSLog(@"%@",error);
? ? }];
運(yùn)行結(jié)果:
如果需要顯示網(wǎng)絡(luò)活動指示器,可以用下面方法:
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html" UserInfo=0x16774de0 {NSErrorFailingURLKey=http://192.168.2.2:8181/ecar/tsp/uploadLocation?CID=781666&serviceType=1, AFNetworkingOperationFailinponseErrorKey= { URL: http://192.168.2.2:8181/ecar/tsp/uploadLocation?CID=781666&serviceType=1 } { status code: 200, headers {
????XXX
} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/html}
返回數(shù)據(jù)格式不對陕贮。注銷這句話:?op.responseSerializer = [AFJSONResponseSerializerserializer];然后將返回的數(shù)據(jù)自己轉(zhuǎn)換。
demo下載地址:點(diǎn)擊打開下載界面
此文章基于AFNetworking2.0潘飘,如果您使用的是2.5版本的肮之,請看這篇文章:AFNetworking2.5使用