Swift3.0:NSURLConnection的使用
一、介绍
应用中也不必不可少的会使用网络通信,增强客户端和服务器的交互,可以使用NSURLConnection实现http通信。
NSURLConnection提供了异步请求和同步请求两种请求方式。同步请求数据会造成主线程阻塞,通常不建议在请求大数据或者网络不畅时使用。
不管是同步请求还是异步请求,建立通信的步骤都是一样的:
1、创建URL对象;
2、创建URLRequest对象;
3、创建NSURLConnection连接;
NSURLConnection创建成功后,就创建了一个http连接。异步请求和同步请求的区别是:
1、创建了异步请求,用户还可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行;
2、创建了同步请求,用户需要在请求结束后才能做其他的操作,这也是通常造成主线程阻塞的原因。
二、示例
同步请求数据方法如下:
//同步请求数据方法如下:
func httpSynchronousRequest(){ // 1、创建URL对象;
let url:URL! = URL(string:"http://api.iclient.ifeng.com/ClientNews?id=SYLB10,SYDT10"); // 2、创建Request对象;
let urlRequest:URLRequest = URLRequest(url:url); // 3、发起NSURLConnection连接
NSURLConnection.sendAsynchronousRequest(urlRequest, queue: .main) { (response:URLResponse?, data:Data?, error:Error?) in if(error != nil){
print(error?.localizedDescription);
}else{
//let jsonStr = String(data: data!, encoding:String.Encoding.utf8);
//print(jsonStr)
do {
let dic = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments)
print(dic)
} catch let error{
print(error.localizedDescription);
}
}
}
}
异步请求数据方法如下:
//在控制器声明一个全局的变量,存储解析到的data数据
var jsonData:NSMutableData = NSMutableData()
//异步请求数据方法如下:
func httpAsynchronousRequest(){
// 1、创建URL对象;
let url:URL! = URL(string:"http://api.iclient.ifeng.com/ClientNews?id=SYLB10,SYDT10"); // 2、创建Request对象;
let urlRequest:URLRequest = URLRequest(url:url); // 3、发起NSURLConnection连接
let conn:NSURLConnection? = NSURLConnection(request:urlRequest,delegate:self)
conn?.schedule(in: .current, forMode: .defaultRunLoopMode)
conn?.start()
}
// MARK - NSURLConnectionDataDelegate
extension ViewController:NSURLConnectionDataDelegate{ func connection(_ connection: NSURLConnection, willSend request: URLRequest, redirectResponse response: URLResponse?) -> URLRequest? { //发送请求
return request;
} func connection(_ connection: NSURLConnection, didReceive response: URLResponse) { //接收响应
} func connection(_ connection: NSURLConnection, didReceive data: Data) { //收到数据
self.jsonData.append(data);
} func connection(_ connection: NSURLConnection, needNewBodyStream request: URLRequest) -> InputStream? {
//需要新的内容流
return request.httpBodyStream;
} func connection(_ connection: NSURLConnection, didSendBodyData bytesWritten: Int, totalBytesWritten: Int, totalBytesExpectedToWrite: Int) {
//发送数据请求
} func connection(_ connection: NSURLConnection, willCacheResponse cachedResponse: CachedURLResponse) -> CachedURLResponse? {
//缓存响应
return cachedResponse;
} func connectionDidFinishLoading(_ connection: NSURLConnection) {
//请求结束
//let jsonStr = String(data: self.jsonData as Data, encoding:String.Encoding.utf8);
//print(jsonStr)
do {
let dic = try JSONSerialization.jsonObject(with: self.jsonData as Data, options: JSONSerialization.ReadingOptions.allowFragments)
print(dic)
} catch let error{
print(error.localizedDescription);
}
}
}
三、解析结果:
(
{
currentPage = 1;
expiredTime = 180000;
item = (
{
comments = 134;
commentsUrl = "http://inews.ifeng.com/ispecial/913/index.shtml";
commentsall = 1818;
documentId = "imcp_crc_1063216227";
id = "http://api.iclient.ifeng.com/TopicApiForCmpp?topicid=913&json=y";
link = {
type = topic2;
url = "http://api.iclient.ifeng.com/TopicApiForCmpp?topicid=913&json=y";
weburl = "http://api.iclient.ifeng.com/TopicApiForCmpp?topicid=913";
};
online = 0;
reftype = editor;
staticId = "client_special_913";
style = {
attribute = "\U4e13\U9898";
backreason = (
"\U5185\U5bb9\U8d28\U91cf\U5dee",
"\U65e7\U95fb\U3001\U91cd\U590d",
"\U6807\U9898\U515a"
);
view = titleimg;
};
styleType = topic;
thumbnail = "http://d.ifengimg.com/w198_h141_q100/p3.ifengimg.com/cmpp/2017/04/02/77c9cacd305fbad2554272f27dfc42e2_size39_w168_h120.jpg";
title = "\U4e60\U8fd1\U5e73\U201c\U4e09\U4f1a\U201d\U5c3c\U5c3c\U65af\U6258";
type = topic2;
},
{
...........
...........
...........
}
四、源码:
//
// ViewController.swift
// NetWorkTest
//
// Created by 夏远全 on 2017/4/3.
// Copyright © 2017年 夏远全. All rights reserved.
// /*
NSURLConnection的使用: */ import UIKit class ViewController: UIViewController { var jsonData:NSMutableData = NSMutableData()
override func viewDidLoad() {
super.viewDidLoad()
//httpSynchronousRequest()
//httpAsynchronousRequest()
} //同步请求数据方法如下:
func httpSynchronousRequest(){ // 1、创建NSURL对象;
let url:URL! = URL(string:"http://api.iclient.ifeng.com/ClientNews?id=SYLB10,SYDT10"); // 2、创建Request对象;
let urlRequest:URLRequest = URLRequest(url:url); // 3、发起NSURLConnection连接
NSURLConnection.sendAsynchronousRequest(urlRequest, queue: .main) { (response:URLResponse?, data:Data?, error:Error?) in if(error != nil){
print(error?.localizedDescription);
}else{
//let jsonStr = String(data: data!, encoding:String.Encoding.utf8);
//print(jsonStr)
do {
let dic = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments)
print(dic)
} catch let error{
print(error.localizedDescription);
}
}
}
} //异步请求数据方法如下:
func httpAsynchronousRequest(){
// 1、创建NSURL对象;
let url:URL! = URL(string:"http://api.iclient.ifeng.com/ClientNews?id=SYLB10,SYDT10"); // 2、创建Request对象;
let urlRequest:URLRequest = URLRequest(url:url); // 3、发起NSURLConnection连接
let conn:NSURLConnection? = NSURLConnection(request:urlRequest,delegate:self)
conn?.schedule(in: .current, forMode: .defaultRunLoopMode)
conn?.start()
}
} // MARK - NSURLConnectionDataDelegate
extension ViewController:NSURLConnectionDataDelegate{ func connection(_ connection: NSURLConnection, willSend request: URLRequest, redirectResponse response: URLResponse?) -> URLRequest? { //发送请求
return request;
} func connection(_ connection: NSURLConnection, didReceive response: URLResponse) { //接收响应
} func connection(_ connection: NSURLConnection, didReceive data: Data) { //收到数据
self.jsonData.append(data);
} func connection(_ connection: NSURLConnection, needNewBodyStream request: URLRequest) -> InputStream? {
//需要新的内容流
return request.httpBodyStream;
} func connection(_ connection: NSURLConnection, didSendBodyData bytesWritten: Int, totalBytesWritten: Int, totalBytesExpectedToWrite: Int) {
//发送数据请求
} func connection(_ connection: NSURLConnection, willCacheResponse cachedResponse: CachedURLResponse) -> CachedURLResponse? {
//缓存响应
return cachedResponse;
} func connectionDidFinishLoading(_ connection: NSURLConnection) {
//请求结束
//let jsonStr = String(data: self.jsonData as Data, encoding:String.Encoding.utf8);
//print(jsonStr)
do {
let dic = try JSONSerialization.jsonObject(with: self.jsonData as Data, options: JSONSerialization.ReadingOptions.allowFragments)
print(dic)
} catch let error{
print(error.localizedDescription);
}
}
}
Swift3.0:NSURLConnection的使用的更多相关文章
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- Swift3.0变化分享
Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...
- swift3.0变化总结
Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...
- 关于for循环------swift3.0
在程序开发当中,for循环使用的频率无疑是最高的.常用的swift循环是递增式遍历.当然各种循环,swift都能办到.但其大多采用关键字形式实现,大部分开发者更喜欢直接使用C式循环代码.在swift3 ...
- Swift2.3 --> Swift3.0 的变化
Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Synt ...
- Swift3.0都有哪些变化
从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行.在W ...
- iOS开发 swift3.0中文版
swift3.0中文版: http://pan.baidu.com/s/1nuHqrBb
- swift3.0的改变
Swift在这2年的时间内,发展势头迅猛,在它开源后,更是如井喷一样,除了 iOS.mac 平台,还支持了 Linux. 而今年下半年, Swift 3.0 也会随之发布.https://github ...
- Swift3.0语言教程字符串与URL的数据转换与自由转换
Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...
随机推荐
- JTree 添加 , 删除, 修改
package com.swing.demo; import java.awt.BorderLayout; import java.awt.Container; import java.awt.eve ...
- css3 matrix 2D矩阵和canvas transform 2D矩阵
一看到“2D矩阵”这个高大上的名词,有的同学可能会有种畏惧感,“矩阵”,看起来好高深的样子,我还是看点简单的吧.其实本文就很简单,你只需要有一点点css3 transform的基础就好. 没有前戏,直 ...
- Android-Toolbar相关
Android-Toolbar相关 学习自 <Android第一行代码> https://www.jianshu.com/p/79604c3ddcae https://www.jiansh ...
- 5969 [AK]刻录光盘
题目描述 Description • 在FJOI2010夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习.组委会觉得这个主意不错!可是组委会一时 ...
- hdu 5775 Bubble Sort 树状数组
Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...
- 接口开发-集成接口文档(swagger)
在正式进入主题之前,先说说实际工作中遇到的问题.不算是传统的原生APP开发,还是眼下的H5混合开发,只要是需要前后端通过接口配合的,往往都存在几个普遍的问题 (1)接口文档谁来写,尤其是跨部门,并且, ...
- 【Go命令教程】3. go install
命令 go install 用于编译并安装指定的代码包及它们的依赖包.当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包.与 go build 命令一样,传给 go install 命 ...
- Go - 反射中 函数 和 方法 的调用 - v.Call()
上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的. 反射中调用 函数 众所周知,Golang 中的 ...
- 华为正在力挺的NB-IoT是什么鬼! - 全文
NB-IoT,Niubility Internet of Thing,即牛掰的物联网技术. 关于物联网,小编想从2款很有趣的应用说起. 这不是在播限制级.这是Nake Labs推出的3D健身镜,这款智 ...
- Time Zones And Daylight Savings Time
This page describes code for working with Time Zones and Daylight Savings Time. Neither VBA nor VB6 ...