今天的重点是UIWebView、NSURLSession、JSon。

网络编程联网准备:1、在Info.plist中添加AppTransportSecurity类型Dictionary;2、在AppTransportSecurity下添加AllowArbitaryLoads类型Boolean。

如果仅仅是查询数据,建议使用GET;如果是增删改数据,建议用POST。

使用第三方框架:Alamofire——著名的AFNetworking网络基础库。

UIWebView的使用:

加载显示网页:

class ViewController: UIViewController, UIWebViewDelegate {

    override func viewDidLoad() {
super.viewDidLoad()
let webView = UIWebView(frame: UIScreen.main.bounds)
let url = URL(string: "http://www.cnblogs.com/quanxi")
let request = URLRequest(url: url!)
webView.loadRequest(request)
webView.delegate = self self.view.addSubview(webView)
}
}

整个过程中,有一些方法:

    //连接改变时
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
return true
}
//UIWebView加载完成时调用,而无论链接是否正确
func webViewDidStartLoad(_ webView: UIWebView) {
print("===hello")
}

网络操作

首先给出一个JSON测试的接口地址:http://mapi.damai.cn/proj/HotProj.aspx?CityId=0&source=10099&version=30602。下面是用Jason.app序列化后的结果:

第一种NSURLConnection(为了获得数据,一定要让类遵循NSURLConnectionDataDelegate):

  1. 首先创建请求对象:var request = NSURLRequest(url: URL(string: "http://www.sina.com")!)。
  2. 创建网络连接的对象:_ = NSURLConnection(request: req as URLRequest, delegate: self),用这个对象来获得数据。
    然后有如下方法可在整个网络请求的过程中调用。
extension ViewController: NSURLConnectionDataDelegate {
//连接网络,连接成功则调用
func connection(_ connection: NSURLConnection, didReceive response: URLResponse) {
let res = response as! HTTPURLResponse
print("===\(res.statusCode)")
}
//连接成功,后服务器请求数据
func connection(_ connection: NSURLConnection, didReceive data: Data) {
print("===\(data)")
downloadData.append(data) //var downloadData = NSMutableData()
}
//http请求结束后,对数据的处理
func connectionDidFinishLoading(_ connection: NSURLConnection) {
//此时downloadData代表了所有的数据
//解析为Json数据
let dict = try! JSONSerialization.jsonObject(with: downloadData as Data, options: .allowFragments) as! NSDictionary
let list = dict["list"] as! NSArray
print("===\(dict)")
for d in list {
var model = Model()
let di = d as! NSDictionary
model.Name = di.object(forKey: "Name") as! String
model.venName = di.object(forKey: "VenName") as! String
model.showTime = di.object(forKey: "ShowTime") as! String
dataSource.add(model)
}
} }

第二种,现在更推崇使用NSURLSession(就必须使用到NSURLSessionTask):

NSURLSessionTask和其子类的关系:

使用NSURLSession的步骤:

  1. 获得会话对象Session的实例
  2. 再通过该实例,创建各种task
  3. 然后编写好task,就可以执行task了。

而真正的使用,有两种方法:

  1. 使用URLRequest对象

    //
    // ViewController.swift
    // k
    //
    // Created by apple on 16/12/30.
    // Copyright © 2016年 liuzhenbing. All rights reserved.
    // import UIKit class ViewController: UIViewController, UIWebViewDelegate { override func viewDidLoad() {
    super.viewDidLoad()
    let url = URL(string: "http://mapi.damai.cn/proj/HotProj.aspx?CityId=0&source=10099&version=30602")
    let request = URLRequest(url: url!) //获得会话对象Session的实例
    let session = URLSession.shared
    //再创建各种需要的task
    let dataTask = session.dataTask(with: request) {
    (data, response, error) in
    var dict: NSDictionary? = nil
    if error == nil {
    do {
    dict = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.init(rawValue: 0)) as? NSDictionary
    } catch {}
    //下面就是JSON的具体解析了:可以参照第一种Connection方法
    let list = dict?["list"] as! NSArray
    for i in list {
    let dic = i as! NSDictionary
    //下面就是最底层,也就是各个具体的字段值
    print("===\(dic.object(forKey: "Name") as! String)")
    }
    }
    }
    dataTask.resume() //执行任务:最关键的一步,一定要记住
    }
    }
  2. 直接使用URL对象:
    //
    // ViewController.swift
    // k
    //
    // Created by apple on 16/12/30.
    // Copyright © 2016年 liuzhenbing. All rights reserved.
    // import UIKit class ViewController: UIViewController, UIWebViewDelegate { override func viewDidLoad() {
    super.viewDidLoad()
    let url = URL(string: "http://mapi.damai.cn/proj/HotProj.aspx?CityId=0&source=10099&version=30602")
    let session = URLSession.shared
    let dataTask = session.dataTask(with: url!) {
    (data, response, error) in
    var dict: NSDictionary? = nil
    if error == nil {
    do {
    dict = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.init(rawValue: 0)) as? NSDictionary
    } catch {}
    let list = dict?["list"] as! NSArray
    for i in list {
    let dic = i as! NSDictionary
    print("===\(dic.object(forKey: "Name") as! String)")
    }
    }
    }
    dataTask.resume()
    }
    }

以上代码都是简单GET示例,下面给出POST的用法:

//let url = URL(string: "http://www.crs811.com/Json/login.php")!,而且POST必须用request的任务
request.httpMethod = "POST"
request.httpBody = "username=crs811&pwd=123456".data(using: .utf8)

网络编程的下载主题:

用swift的URLSession来下图片:

class ViewController: UIViewController, URLSessionDownloadDelegate {

    override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "http://images2015.cnblogs.com/blog/1032080/201612/1032080-20161206214110210-418912424.jpg")!
//session一定要这样设置,因为要更改下载的代理
let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil)
let downLoadTask = session.downloadTask(with: url)
downLoadTask.resume()
//以上代码就已经把想要的文件,下下来了,但是现在,还有两个问题:要找到文件;这个文件还不能用,因为是.tmp的,要另存为,如.jpg
} func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
let source = location.path
let save = NSHomeDirectory().appending("/test.jpg")
print("===\(save)")
let fileManager = FileManager.default
do {
if fileManager.fileExists(atPath: save) { //如果文件存在,不删除的话,继续保存在这里,是会失败的
try fileManager.removeItem(atPath: save)
}
try fileManager.moveItem(atPath: source, toPath: save)
} catch {}
} }

用SDWebImage库异步加载一张图片(是UIImageView调用该方法,而不是UIImage):

首先引入库的时候有几个选项,记住一定不要选引用,还要记住设置联网。

@IBOutlet weak var img: UIImageView!

    override func viewDidLoad() {
super.viewDidLoad()
img?.sd_setImage(with: URL(string: "http://www.crs811.com/wp-content/uploads/2016/11/test.jpg"))

如果使用cocoaPods来管理库,也要搭建OC桥才能使用(不知道是不是该库是OC的缘故)。一个简单的例程:http://download.csdn.net/detail/leaf_and_wind/9724825

iOS网络编程的更多相关文章

  1. iOS网络编程模型

    iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...

  2. IOS网络编程——第三方类库

    IOS网络编程——第三方类库 目录 概述 ASIHttpRequest AFNetworking 其他 概述 ASIHttpRequest AFNetworking 其他

  3. IOS网络编程:HTTP

    IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...

  4. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

  5. 浅谈iOS网络编程之一入门

    计算机网络,基本上可以抽象是端的通信.实际在通讯中会用到不同的设备,不同的硬件中,为了能友好的传输信息,那么建立一套规范就十分必要了.先来了解一些基本概念 了解网络中传输的都是二进制数据流.  2.了 ...

  6. iOS 网络编程:socket

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  7. iOS 网络编程模式总结

    IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式.stream方式.url 方式. 一 .socket 方式 IOS 提供的socket 方式的网络编程接口为C ...

  8. ios网络编程(入门级别)-- 基础知识

    在学习ios的过程中,停留在UI控件很长时间,现在正在逐步的接触当中!!!!!!在这个过程中,小编学到了一些关于网络编程知识,并且有感而发,在此分享一下: 关于网络请求的重要性我想不用多说了吧!!!对 ...

  9. iOS 网络编程(HTTP协议)

    HTTP协议的概念HTTP协议,Hyper Text Transfer Protocol (超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响应 ...

  10. 从socket开始讲IOS网络编程

    home list tags talk user rss Mac&iOS Socket 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半 ...

随机推荐

  1. 从零开始编写自己的C#框架(1)——前言

    记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种语言,也只能整天混在图收馆里拼命的啃书.而再后 ...

  2. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  3. Laravel学习--关于Relation的坑

    前段时间比较忙,就没有坚持写博客,但发现这周末再想捡起来,好难,一直到了今天晚上,才决定坐下来写一篇,哈哈哈-- 最近在用 Laravel 5.2,踩了几个关于 Relation 的坑,在这里用博客记 ...

  4. 【NLP】Python NLTK 走进大秦帝国

    Python NLTK 走进大秦帝国 作者:白宁超 2016年10月17日18:54:10 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公 ...

  5. 1元搭建自己的云服务器&解析域名

    最近在学做微信开发,没有自己的域名和服务器就不得不寄人篱下,索性自己就到云主机上搭建了个服务器,但是水平有限弄了一个下午~~有自己的域名和服务器的好处相信不用我多说了.比如日后可以有自己域名的个性博客 ...

  6. Java进击C#——语法之IO操作

    本章简言 上一章我们对线程同步进行讲解.了解如何去处理可能发生的脏数据.而本章就要讲有关于C#在读取IO文件的时候,常常用到的操作类.这一章的内容会比较少.但是笔者还是总结出来让读者们有一个学习的方向 ...

  7. Redis命令拾遗一(字符串类型)

    文章归博客园和作者“蜗牛”共同所有 .转载和爬虫请注明原文Redis系列链接 http://www.cnblogs.com/tdws/tag/NoSql/ Redis有五种基本数据类型.他们分别是字符 ...

  8. Xcode7.1环境下上架iOS App到AppStore 流程① (Part 一)

    前言部分 之前App要上架遇到些问题到网上搜上架教程发现都是一些老的版本的教程 ,目前iTunesConnect 都已经迭代好几个版本了和之前的 界面风格还是有很大的差别的,后面自己折腾了好久才终于把 ...

  9. 偷天换日:网络劫持,网页js被伪装替换。

    偷天换日 3月12号石家庄一个客户(后面简称乙方)有几家门店,平台收银(web)有一些功能无法正常使用,平台有上千家门店在使用,到目前为止别的省份都没有此问题.远程协助发现,js日期控件无法正常调用, ...

  10. CSS常用渐变

    边框渐变: border-image: -webkit-linear-gradient( red , blue) 30 30; border-image: -moz-linear-gradient( ...