URL Session(NSURLSessionDataTask)

URL Session(NSURLSession)
URL Session(NSURLSessionDataTask))
URL Session(NSURLSessionUploadTask)
URL Session(NSURLSessionDownloadTask)
URL Session(Cache).md
URL Session(Cookie)
이 블로그에서는 전체 프로젝트에서 가장 중요한 기능인 서버와 통신하는 것을 설명합니다.현재의 앱은 단독으로 조작하는 것이 매우 적고 기본적으로 서버와 통신할 것이라고 믿는다.

1 NSURLSessionDataTask


서버와 통신하는 데 사용된 클래스는 NSURLSessionDataTask입니다. 초기에 우리는 NSURLConnection을 사용하여 통신을 완성했습니다.
NSURLSessionDataTask는 NSURLSession의 하위 클래스로 서버에 데이터를 보내는 동시에 서버가 보낸 데이터를 받아들여 짧은 연결 작업입니다.

2 프로젝트 구축


당신이 어떤 항목을 사용하든 상관없습니다. 이번에는 NSURLSessionDataTask의 관련 기능을 테스트하기 위해서입니다.이를 위해 클래스 YJDataTaskVC를 사용합니다.
//
// YJDataTaskVC.swift
// NSURLSession
//
// CSDN:http://blog.csdn.net/y550918116j
// GitHub:https://github.com/937447974/Blog
//
// Created by yangjun on 15/12/3.
// Copyright © 2015   . All rights reserved.
//

import UIKit

/// NSURLSessionDataTask 
class YJDataTaskVC: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

}

이것은 매우 깨끗한 종류로 모두가 일목요연하다고 믿는다.너는 너의 프로젝트가 이 VC에 들어갈 수 있다는 것을 보증하기만 하면 된다.

3 비동기식 요청


NSURLSession 전체 시리즈의 요청은 고도로 비동기적이며, 사용자가 요청을 한 후 데이터가 돌아오지 않을 때 다른 조작을 할 수 있습니다.
네트워크 요청 시 일반적으로 3단계로 나뉜다.
  • NSURLRequest 또는 NSMutableURLRequest를 사용하여 서버 주소, 서버에 보내는 정보, 요청 시간 초과 제어, 요청 방식 등 관련 정보를 봉인합니다
  • NSMutableURLRequest를 사용하여 다른 작업을 만들고 resume() 방법으로 서버에 메시지를 보냅니다
  • completionHandler 패키지에서 서버가 보낸 데이터를 처리..

  • 3.1 요청 받기


    통신에서 get은 가장 간단한 요청 방식입니다. URL 링크 하나로 서버가 보낸 데이터를 얻을 수 있습니다.YJDataTaskVC에 다음 코드를 추가합니다.
    // MARK: -  
    // MARK: Get 
    func sendRequestGet() {
        //  
        let urlStr = "https://raw.githubusercontent.com/937447974/Swift/master/NSURLSession/NSURLSession/YJDataTaskVC.swift"
        if let url = NSURL(string: urlStr) {
            //  
            let request = NSURLRequest(URL: url)
            // 1. session , session
            let session = NSURLSession.sharedSession()
            // 2.  NSURLSessionDataTask
            let dataTask = session.dataTaskWithRequest(request) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
                //  
                if data != nil {
                    self.jsonObjectWithData(data!)
                } else {
                    print(" :\(error?.localizedDescription)")
                }
            }
            dataTask.resume() // 3. http 
        }
    }
    
    // MARK: - data 
    func jsonObjectWithData(data: NSData) -> [String: AnyObject]? {
        var dict: [String: AnyObject]? = nil
        do {
            // data -> AnyObject
            let jsonObject = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)
            dict = jsonObject as? [String: AnyObject]
            print(" :\(dict)")
        } catch {
            print(" , :\(error)")
            print(" :\(NSString(data: data, encoding: NSUTF8StringEncoding)))")
        }
        return dict
    }

    방법sendRequestGet () 에서, 나는 get을 사용하여 github의 현재 클래스의 원본 코드를 가져옵니다.여기서 json Object With Data는 서버에서 보낸 NSData 데이터를 사전으로 변환하기 위한 것입니다.
    viewDidLoad()에 코드를 추가합니다.
    override func viewDidLoad() {
        super.viewDidLoad()
        //  
        self.sendRequestGet()
    }

    프로젝트를 실행하면 컨트롤러에서 출력 정보를 볼 수 있습니다.

    3.2 포스트 요청


    네트워크 통신에서 우리가 가장 자주 사용하는 것은post가 데이터를 제출하는 것이다.로그인, 등록, 비밀번호 수정 등 기능은 비동기적인 포스트를 통해 이루어진다.
    // MARK: - Post 
    func sendRequestPost() {
        let urlStr = "https://www.baidu.com"
        if let url = NSURL(string: urlStr) {
            //  
            let request = NSMutableURLRequest(URL: url)
            request.HTTPMethod = "POST" // POST, GET
            request.addValue("text/xml", forHTTPHeaderField: "Content-Type")//  
            //  
            let dict = ["name": " ", "qq": "937447974"]
            do {
                try request.HTTPBody = NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions.PrettyPrinted)
                print(" :\(NSString(data: request.HTTPBody!, encoding: NSUTF8StringEncoding))")
            } catch {
                print("json :\(error)")
            }
            // 1. session , session
            let session = NSURLSession.sharedSession()
            // 2.  NSURLSessionDataTask
            let dataTask = session.dataTaskWithRequest(request) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
                //  
                if data != nil {
                    self.jsonObjectWithData(data!)
                } else {
                    print(" :\(error?.localizedDescription)")
                }
            }
            dataTask.resume() // 3. http 
        }
    }

    post 요청은 get 요청보다 몇 단계 더 많습니다. 더 많은 절차는 우리의 데이터를 NSMutableURLRequest에 봉인하는 것입니다.

    4 동기화


    NSURLSession에서는 동기화가 이루어지지 않지만 비즈니스 요구 사항으로 인해 사용자의 요청이 동기화되는 경우가 있습니다.여기서 NSURLConnection을 사용하여 동기화 작업을 완료할 수 있습니다.
    여기에는 Post의 동기화 요청만 표시됩니다.Get에 대한 자세한 내용은 NSURLSession의 get 요청과 같습니다.
    // MARK: -  Post 
    func sendSynchronousRequestPOST() {
        let urlStr = "https://www.baidu.com"
        if let url = NSURL(string: urlStr) {
            //  
            let request = NSMutableURLRequest(URL: url)
            request.HTTPMethod = "POST" // POST, GET
            request.addValue("text/xml", forHTTPHeaderField: "Content-Type")//  
            //  
            let dict = ["name": " ", "qq": "937447974"]
            do {
                try request.HTTPBody = NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions.PrettyPrinted)
                print(" :\(NSString(data: request.HTTPBody!, encoding: NSUTF8StringEncoding))")
            } catch {
                print("json :\(error)")
            }
            //  
            do {
                let data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
                self.jsonObjectWithData(data)
            } catch {
                print(" :\(error)")
            }
    
        }
    }

    관련 테스트는 스스로 완성할 수 있다. 

    기타


    소스 코드


    Swift

    참고 자료


    URL Session Programming Guide

    문서 수정 기록


    시간
    묘사
    2015-12-04
    박문 완성
    2015-12-12
    링크 변경

    저작권 소유


    CSDN:http://blog.csdn.net/y550918116j
    GitHub:https://github.com/937447974/Blog

    좋은 웹페이지 즐겨찾기