swift中的网络请求——NSURLSessionDataTask

学习地址:https://github.com/potato512/SYSwiftLearning

效果


在swift中使用NSURLSessionDataTask进行网络编程。

// NSURL
let url:NSURL = NSURL(string:"http://rapapi.org/mockjsdata/22598/userloginGet")!
// NSURLRequest
let request:NSURLRequest = NSURLRequest(URL:url)
// NSURLSession
let configuration:NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
let session:NSURLSession = NSURLSession(configuration: configuration)
        
// NSURLSessionTask
let task:NSURLSessionDataTask = session.dataTaskWithRequest(request,completionHandler: {
            (data:NSData?,response:NSURLResponse?,error:NSError?) -> Void in
            if error == nil
            {
                do {
                    let result:NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!,options: NSJSONReadingOptions.AllowFragments) as! NSDictionary
                    print(result)
                    
                    dispatch_async(dispatch_get_main_queue(),{
                        () -> Void in
                        let message:String = result.objectForKey("msg") as! String
                        let alert = UIAlertView(title: nil,message: message,delegate: nil,cancelButtonTitle: "OK")
                        alert.show()
                    })
                    
                } catch {
                    
                }
            }
})
// 启动任务
task.resume()

// NSURL
let url:NSURL = NSURL(string:"http://rapapi.org/mockjsdata/22598/userloginPostWithParams")!
// NSURLRequest
let request:NSMutableURLRequest = NSMutableURLRequest(URL:url)
request.HTTPMethod = "POST"
// 参数
// 方法1
// let postString = "userName=devZhang&userPassword=devZhang"
// request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
// 方法2
let postDic :NSDictionary = ["userName":"devZhang","userPassword":"devZhang"]
do {
            let data:NSData = try NSJSONSerialization.dataWithJSONObject(postDic,options: NSJSONWritingOptions.PrettyPrinted)
            request.HTTPBody = data
        } catch {
            
}

        
        
// NSURLSession
let configuration:NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
let session:NSURLSession = NSURLSession(configuration: configuration)
        
// NSURLSessionTask
let task:NSURLSessionDataTask = session.dataTaskWithRequest(request,cancelButtonTitle: "OK")
                        alert.show()
                    })
                    
                } catch {
                    
                }
            }
})
// 启动任务
task.resume()


遵守协议 NSURLSessionDelegate 并设置代理的请求方法,同时定义属性 var data:NSMutableData! 以用于接收返回的数据。

// 请求路径
let url: NSURL = NSURL(string:"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON")!
// 请求对象
// 请求对象内部默认已经包含了请求头和请求方法(GET)
let request: NSURLRequest = NSURLRequest(URL: url)
// 会话对象,并设置代理
/*
第一个参数:会话对象的配置信息 defaultSessionConfiguration 表示默认配置
第二个参数:谁成为代理,此处为控制器本身即self,协议 NSURLSessionDelegate
第三个参数:队列,该队列决定代理方法在哪个线程中调用,可以传主队列|非主队列
[NSOperationQueue mainQueue]   主队列:   代理方法在主线程中调用
[[NSOperationQueue alloc]init] 非主队列: 代理方法在子线程中调用
*/
let session: NSURLSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),delegate: self,delegateQueue: NSOperationQueue.mainQueue())
// 根据会话对象创建一个Task(发送请求)
let dataTask: NSURLSessionTask = session.dataTaskWithRequest(request)
// 执行任务
dataTask.resume()


// 接收到服务器响应的时候调用方法
func URLSession(session: NSURLSession,dataTask: NSURLSessionDataTask,didReceiveResponse response: NSURLResponse,completionHandler: (NSURLSessionResponseDisposition) -> Void) {
        
        // 响应头信息,即response
        print("didReceiveResponse--%@",response)
        
        // 注意:需要使用completionHandler回调告诉系统应该如何处理服务器返回的数据
        // 默认是取消的
        /*
        NSURLSessionResponseCancel = 0,默认的处理方式,取消
        NSURLSessionResponseAllow = 1,接收服务器返回的数据
        NSURLSessionResponseBecomeDownload = 2,变成一个下载请求
        NSURLSessionResponseBecomeStream        变成一个流
        */
        completionHandler(NSURLSessionResponseDisposition.Allow)
}


// 接收到服务器返回数据的时候会调用方法,如果数据较大那么该方法可能会调用多次
func URLSession(session: NSURLSession,didReceiveData data: NSData) {
        
        print("didReceiveData--%@",data)
        
        // 拼接服务器返回的数据
        if self.data == nil
        {
            self.data = NSMutableData()
        }
        self.data.appendData(data)
}


// 当请求完成(成功|失败)的时候会调用方法,如果请求失败,则error有值
func URLSession(session: NSURLSession,task: NSURLSessionTask,didCompleteWithError error: NSError?) {
  
        if (error == nil)
        {
            //解析数据,JSON解析请参考http://www.cnblogs.com/wendingding/p/3815303.html
            var dict:NSDictionary? = nil
            do {
                dict  = try NSJSONSerialization.JSONObjectWithData(self.data,options: NSJSONReadingOptions.init(rawValue: 0)) as? NSDictionary
            } catch {
                
            }
            
            print("%@",dict)
        }
}

相关文章

Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章。自从苹果发布 Swfit 编程语言,就成为了...
快,快,快!动动您的小手,分享给更多朋友! 苹果去年推出了全新的编程语言Swift,试图让iOS开发更简单...
开发者(KaiFaX) 面向开发者、程序员的专业平台! 和今年年初承诺的一样,苹果贴出了Swift语言的源码,...
本文由@Chun发表于Chun Tips :http://chun.tips/blog/2014/12/11/shi-yong-swift-gou-jian-zi-ding-yi...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...