一、介绍

应用中也不必不可少的会使用网络通信,增强客户端和服务器的交互,可以使用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的使用的更多相关文章

  1. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  2. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  3. Swift3.0变化分享

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

  4. swift3.0变化总结

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

  5. 关于for循环------swift3.0

    在程序开发当中,for循环使用的频率无疑是最高的.常用的swift循环是递增式遍历.当然各种循环,swift都能办到.但其大多采用关键字形式实现,大部分开发者更喜欢直接使用C式循环代码.在swift3 ...

  6. Swift2.3 --> Swift3.0 的变化

    Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Synt ...

  7. Swift3.0都有哪些变化

    从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行.在W ...

  8. iOS开发 swift3.0中文版

    swift3.0中文版: http://pan.baidu.com/s/1nuHqrBb

  9. swift3.0的改变

    Swift在这2年的时间内,发展势头迅猛,在它开源后,更是如井喷一样,除了 iOS.mac 平台,还支持了 Linux. 而今年下半年, Swift 3.0 也会随之发布.https://github ...

  10. Swift3.0语言教程字符串与URL的数据转换与自由转换

    Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...

随机推荐

  1. JTree 添加 , 删除, 修改

    package com.swing.demo; import java.awt.BorderLayout; import java.awt.Container; import java.awt.eve ...

  2. css3 matrix 2D矩阵和canvas transform 2D矩阵

    一看到“2D矩阵”这个高大上的名词,有的同学可能会有种畏惧感,“矩阵”,看起来好高深的样子,我还是看点简单的吧.其实本文就很简单,你只需要有一点点css3 transform的基础就好. 没有前戏,直 ...

  3. Android-Toolbar相关

    Android-Toolbar相关 学习自 <Android第一行代码> https://www.jianshu.com/p/79604c3ddcae https://www.jiansh ...

  4. 5969 [AK]刻录光盘

    题目描述 Description • 在FJOI2010夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习.组委会觉得这个主意不错!可是组委会一时 ...

  5. hdu 5775 Bubble Sort 树状数组

    Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...

  6. 接口开发-集成接口文档(swagger)

    在正式进入主题之前,先说说实际工作中遇到的问题.不算是传统的原生APP开发,还是眼下的H5混合开发,只要是需要前后端通过接口配合的,往往都存在几个普遍的问题 (1)接口文档谁来写,尤其是跨部门,并且, ...

  7. 【Go命令教程】3. go install

    命令 go install 用于编译并安装指定的代码包及它们的依赖包.当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包.与 go build 命令一样,传给 go install 命 ...

  8. Go - 反射中 函数 和 方法 的调用 - v.Call()

    上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的. 反射中调用 函数 众所周知,Golang 中的 ...

  9. 华为正在力挺的NB-IoT是什么鬼! - 全文

    NB-IoT,Niubility Internet of Thing,即牛掰的物联网技术. 关于物联网,小编想从2款很有趣的应用说起. 这不是在播限制级.这是Nake Labs推出的3D健身镜,这款智 ...

  10. Time Zones And Daylight Savings Time

    This page describes code for working with Time Zones and Daylight Savings Time. Neither VBA nor VB6 ...