美文网首页iOS干货
NSURLConnection与NSURLSession网络基础

NSURLConnection与NSURLSession网络基础

作者: 小苗晓雪 | 来源:发表于2017-07-17 10:38 被阅读8次

    AppDelegate.m

    #import "AppDelegate.h"
    #import "ViewController.h"
    
    
    @interface AppDelegate ()
    
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        ViewController *vc = [[ViewController alloc] init];
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
        self.window.rootViewController = nav;
        
        return YES;
    }
    
    
    - (void)applicationWillResignActive:(UIApplication *)application {
        
    }
    
    
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        
    }
    
    
    - (void)applicationWillEnterForeground:(UIApplication *)application {
        
    }
    
    
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        
    }
    
    
    - (void)applicationWillTerminate:(UIApplication *)application {
        
    }
    
    
    @end
    
    

    ViewController.m

    #import "ViewController.h"
    
    typedef NS_ENUM(NSInteger , MDDemoType)
    {
        MDDemoTypeRequest = 0,
        MDDemoTypeConnection,
        MDDemoTypeSession,
        MDDemoTypeSessionDelegate,
        MDDemoTypePostConnection,
        MDDemoTypePostSession,
    };
    
    static NSString *const kReuseIdentifier = @"kReuseIdentifier";
    
    //static NSString *const kURLString = @"https://api.douban.com/v2/book/17604305?fields=title,id,url,publisher,author";
    NSString * const kURLString = @"http://putsreq.com/0SMBaDzt2mCQn8UHXAir";
    
    @interface ViewController ()<UITableViewDelegate , UITableViewDataSource , NSURLConnectionDelegate , NSURLConnectionDataDelegate , NSURLSessionDelegate , NSURLSessionDataDelegate , NSURLSessionTaskDelegate , NSURLSessionDownloadDelegate>
    
    @property (nonatomic, strong) UITableView *tableView;
    @property (nonatomic, strong) NSMutableArray<NSDictionary *> *dataSourceArray;
    @property (nonatomic, strong) NSURLResponse *response;
    @property (nonatomic, strong) NSMutableData *responseData;
    @property (nonatomic, copy) NSString *responseString;
    @property (nonatomic, strong) id responseInfo;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
        [self loadTableView];
        [self loadData];
        
    }
    
    #pragma mark - loadTableView
    - (void)loadTableView
    {
        self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
        self.tableView.delegate = self;
        self.tableView.dataSource = self;
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kReuseIdentifier];
        [self.view addSubview:self.tableView];
    }
    
    #pragma mark - loadData
    - (void)loadData
    {
        self.dataSourceArray = [NSMutableArray array];
        
        [self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypeRequest] , @"title" : @"创建请求"}];
        [self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypeConnection] , @"title" : @"NSURLConnection"}];
        [self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypeSession] , @"title" : @"NSURLSession"}];
        [self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypeSessionDelegate] , @"title" : @"NSURLSession delegate"}];
        [self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypePostConnection] , @"title" : @"POST请求 NSURLConnection"}];
        [self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypePostSession] , @"title" : @"POST请求 NSURLSession"}];
        
    }
    
    #pragma mark - <UITableViewDataSource>
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return self.dataSourceArray.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kReuseIdentifier];
        cell.textLabel.text = [self.dataSourceArray[indexPath.row] objectForKey:@"title"];
        return cell;
    }
    
    #pragma mark - <UITableViewDelegate>
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        MDDemoType demoType = [[self.dataSourceArray[indexPath.row] objectForKey:@"tag"] integerValue];
        switch (demoType) {
            case MDDemoTypeRequest:
                [self testRequest];
                break;
            case MDDemoTypeConnection:
                [self testNSURLConnection];
                break;
            case MDDemoTypeSession:
                [self testSession];
                break;
            case MDDemoTypeSessionDelegate:
                [self testSessionDelegate];
                break;
            case MDDemoTypePostConnection:
                [self testPostConnection];
                break;
            case MDDemoTypePostSession:
                [self testPostSession];
                break;
            default:
                break;
        }
    }
    
    /**
     *  Demo...
     
     */
    
    #pragma mark - testRequest
    - (void)testRequest
    {
        NSURL *url = [NSURL URLWithString:kURLString];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        request.HTTPMethod = @"POST";
    //    [request setValue:@"testRequest" forHTTPHeaderField:@"User-Agent"];
        request.allHTTPHeaderFields = @{@"application/json" : @"Content-Type",
                                        @"testRequest" : @"User-Agent"};
        
    }
    
    #pragma mark - testNSURLConnection
    - (void)testNSURLConnection
    {
        NSURL *url = [NSURL URLWithString:kURLString];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
        [connection start];
    }
    
    #pragma mark - <NSURLConnectionDelegate>
    /**
     *  接收到网络请求
     
     */
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        NSLog(@"接收到网络数据   %@" , response);
        self.response = response;
        if ([response isKindOfClass:[NSHTTPURLResponse class]])
        {
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
            //取到状态码:
            NSInteger statusCode = httpResponse.statusCode;
            //取到请求头部:
            NSDictionary *headerDic = httpResponse.allHeaderFields;
            NSLog(@"statusCode = %@" , @(statusCode));
            NSLog(@"headerDic = %@" , headerDic);
        }
        //初始化一个空的data:
        self.responseData = [NSMutableData data];
        
    }
    /**
     *  接收到网络数据
     
     */
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        NSLog(@"正在接收网络数据   %@" , data);
        
        if (nil != data) {
            [self.responseData appendData:data];
        }
    }
    /**
     *  完成网络请求
     
     */
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        NSLog(@"网路请求完成  =  %@", connection);
        NSLog(@"currentRequest  =  %@" , connection.currentRequest);
        //网络请求完成后把data文件转成可读的string类型:
        self.responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
        self.responseInfo = [NSJSONSerialization JSONObjectWithData:self.responseData options:0 error:nil];
        NSLog(@"self.responseInfo = %@" , self.responseInfo);
        
    }
    /**
     *  网络请求失败
    
     */
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
        NSLog(@"网路请求失败  =  %@" , error);
        NSLog(@"currentRequest  =  %@" , connection.currentRequest);
        
    }
    
    #pragma mark - testSession
    - (void)testSession
    {
        NSURL *url =[NSURL URLWithString:kURLString];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            
            self.response = response;
            self.responseData = [NSMutableData dataWithData:data];
            self.responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
            self.responseInfo = [NSJSONSerialization JSONObjectWithData:self.responseData options:0 error:&error];
            
        }];
        [task resume];
        
    }
    
    #pragma mark - testSessionDelegate
    - (void)testSessionDelegate
    {
        //发送网络会话请求任务:
        //创建请求地址:
        NSURL *url = [NSURL URLWithString:kURLString];
        //创建请求:
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        //创建会话:
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        //会话根据网络请求创建出网络任务:
        NSURLSessionTask *task = [session dataTaskWithRequest:request];
        //开启任务:
        [task resume];
    }
    
    #pragma mark - <NSURLSessionDelegate>
    //接收到响应:
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
    {
        self.response = response;
        self.responseData = [NSMutableData data];
        //如果存在回调信息就执行该回调:
        if (completionHandler) {
            //继续接收从服务器返回的数据:NSURLSessionResponseAllow;
            completionHandler(NSURLSessionResponseAllow);
        }
    }
    
    //接收响应信息中...:
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
    {
        [self.responseData appendData:data];
    }
    
    //响应接收完成或者响应接收失败打印错误信息:
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
    {
        //处理错误:
        if (error)
        {
            NSLog(@"error = %@", error);
        }
        else
        {
            self.responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
            self.responseInfo = [NSJSONSerialization JSONObjectWithData:self.responseData options:0 error:nil];
        }
    }
    
    #pragma mark - testPostConnection
    - (void)testPostConnection
    {
        NSURL *url = [NSURL URLWithString:kURLString];
        NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url];
        mutableRequest.HTTPMethod = @"POST";
        [mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        
        NSDictionary *parameters = @{
                                     @"book": @(17604305),
                                     @"title":@"好书",
                                     @"comment":@"我觉得这是一本好书",
                                     @"rating":@(5)
                                     };
        
        NSData *body = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];
        mutableRequest.HTTPBody = body;
        //创建connection链接:
        NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:mutableRequest delegate:self startImmediately:NO];
        [connection start];
        
    }
    
    #pragma mark - testPostSession
    - (void)testPostSession
    {
        NSURL *url = [NSURL URLWithString:kURLString];
        NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url];
        mutableRequest.HTTPMethod = @"POST";
        [mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        NSDictionary *parameters = @{
                                     @"book": @(17604305),
                                     @"title":@"好书",
                                     @"comment":@"我觉得这是一本好书",
                                     @"rating":@(5)
                                     };
        NSData *body = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];
        mutableRequest.HTTPBody = body;
        
        
        //delegate方式:
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        NSURLSessionTask *task = [session dataTaskWithRequest:mutableRequest];
        [task resume];
        
        /*
        //block方式:
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
        NSURLSessionDataTask *task = [session dataTaskWithRequest:mutableRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            
            self.response = response;
            self.responseData = [NSMutableData dataWithData:data];
            self.responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
            self.responseInfo = [NSJSONSerialization JSONObjectWithData:self.responseData options:0 error:&error];
            NSLog(@"%@" , self.responseString);
            
        }];
        
        [task resume];
        */
         
    }
    
    #pragma mark - 内存警告
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        
    }
    
    @end
    

    愿编程让这个世界更美好

    相关文章

      网友评论

        本文标题:NSURLConnection与NSURLSession网络基础

        本文链接:https://www.haomeiwen.com/subject/ykjfkxtx.html