接下来的书上的翻译:
准备:现在你要做的是下载AFNetworking 然后添加到你的工程当中。
接下来要做的:创建ITunesClient类,这个类主要是通过iTunes API检索iTunes中的信息。
创建 ITunesClient 头文件
ITunesClinet继承自AFHTTPSessionManager,它的代码如下:
#import "AFHTTPSessionManager.h"
@interface ITunesClinet:AFHTTPSessionManager
+(ITunesClinet *)sharedClinet;
-(NSURLSessionDataTask *)searchType:(NSString *)type withTerm:(NSString *)term completion:(void(^)(NSDictionary *results,NSError *error))completion;
@end
头文件中,定义两个方法,iTunesClient类是通过单例设计模式实现的类,所以我们可以通过静态方法shareClient方法来调用iTunesClient实例,然后通过searchType:withTerm:completion:方法来搜索iTunes资料库。
实现shareClient方法
这个方法将被用来调用ITunesClient实例:
+(ITunesClient *)sharedClient{
static ITunesClient *sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
NSURL *baseURL = [NSURL URLWithString:@"https://itunes.apple.com/"];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
sharedClient = [[ITunesClinet alloc] initWithBaseURL:baseURL sessionConfiguration:config];
sharedClient.responseSerializer = [AFJSONResponseSerializer serializer];
});
return sharedClient;
}
在sharedClient方法中,我们定一个一个名为sharedClient静态变量初始化一次有且只有一次。我们通过GCD的dispatch_once方法初始化,只是Objective-c比较推崇的单例设计模式。
在dispatch_once我们定义了一个baseURL变量,并讲其设置为"http://itunes.apple.com,"这是iTunes的基础URL但这不是完整的iTunes搜索API地址,我们可以通过searchType:with Term:completion:failure方法来添加其余部分,然后我们使用defaultSessionConfiguration创建NSURLSessionConfiguratin,这里我们使用简单的默认值,当然你也可以自定义。
我们现在初始化ITunesClient的initWithBaseURL:sessionConfiguration:构造函数,在这个例子中我们使用AFNetworking 来响应iTunes API,在默认情况下,我们通过AFJSONResponseSerializer解析JSON。
初始化searchType:withTerm:completion方法
-(NSURLSessionDataTask *)searchType:(NSString *)type withTerm:(NSString *)term completion:(void*()(NSDictionary *results,NSError *error)) completion{
NSDictionary *params = [[NSDictionary alloc]initWithObjectsAndKey:type,@"enity",term,@"term",nil];
NSURLSessionDataTask *task = [self GET:@"/search" parameters:params success:^(NSURLSessionDataTask *task,id responseObjecr){
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)task.response;
if (httpResponse.statusCode == 200){
dispatch_async(dispatch_get_main_queue(),^{
completion(responseObject,nil);
});
}else{
dispatch_async(dispatch_get_main_queue(),^{
completion(nil,nil);
});
}
}failure ^(NSURLSessionDataTask *task,NSError *error){
dispatch_async(dispatch_get_main_queue(),^{
completion(nil,error);
});
}];
return task;
}
我们使用类型参数来指定搜索,参数就是指定搜索项,我们创建一个包含搜索项的NSDictionary作为HTTP的请求参数。
接下来我们调用在AFHTTPSessionManager中的GET方法:GET:parameters:success:failure:这个方法,并以此简历基本的URL,如果我们想找Jimmuy+Buffett的专辑,我们就可以通过 iTunes API搜索到相关信息,你可以通过
http://www.apple.com/itunes/ affiliates/resources/documentation/itunes-store-web-service-search- api.html. 获取更多信息。
AF的POST方法,有着和GET差不多的方法,GET:parameters:success:failure:方法,POST方法是这样写的:POST:parameters:success:failure。
如果请求成功,就会调用成功的代码块,但是这并不意味着,整个请求就是成功的,只要在成功代码块中验证响应码是200,这就代表请求本身成功了,就会返回调用responseObject代码块,否则就能返回代码块中的nil。
如果请求成功,AFHTTPSessionManager传递响应序列化,回想到shareClient方法,用AFJSONResponseSerializer来解析JSON对象,包含的NSDictionary对象。
AFNetworking 包含几个标准的序列化,包括AFJSONResponseSerializer,AFXMLResponseSerializer,AFXMLDocumentResponseSerializer,AFPropertyListResponseSerializer和AFImageResponseSerializer。
使用ITunesClient 类
NSString *type = @"album";
NSString *term = @"jimmy + buffett";
ITunesClient *itunesClient = [ITunesClient sharedClient];
[itunesClient searchType:type withTerm:term completion ^(NSDictionary *results,NSError *error){
if (results){
NSLog(@"%@",results);
}else{
NSLog(@"ERROR:%@",error);
}
}];
type:这表示将要执行的搜索类型
term:要搜索的东西
completion:一旦搜索完成就调用这个代码块
按照上面的方法我们就能完成一个基本的网络请求。