swift4初探之网络请求
来源:互联网 发布:热化学数据库建库情况 编辑:程序博客网 时间:2024/05/18 02:38
都说程序员必须要写博客,可是作为一个老程序员的我基本上是看别人的博客,自己很少写,其中最主要的原因是自己懒,不愿意总结,还一个原因就是现在的网络实在太发达了,写代码也基本不用看什么书,背什么代码,理解几个设计模式,会个选择,顺序,循环就都可以写说自己是程序员了,剩下的哪不会百度就好,下面会出来一堆和你遇到类似问题的人,和类似的问题解决方法,所以我也就更懒得去写了。那么从现在开始就要慢慢改过来了,一方面是觉得自己岁数大了,写了这么久代码是应该总结总结了,另一个原因是swift4现在国内的资源确实不多,所以自己为了以后的发展打算,有必要总结一下,写一下swift4的基本用法,这篇文章主要就是swift4的网络请求,还包括闭包的声明,使用,delegate的声明使用,但是还是有oc的影子,看到@objc了吗?没办法,找不到其他的方法不用@objc,只能一步一步根据提示又把它加上来了,还好最后的用法看起来确实像swift。废话不多说,下面的两片代码,第一个是网络请求封装,包括,post,get请求方式,闭包,代理回调方式,都有。第二个就是调用。自己总结的同时也希望能够抛砖引玉,让更多的人入门,也欢迎大家评论,给出更好的建议和连接。
//
// HTTPConnection.swift
// Swift4HttpConnectionDemo
//
// Created by 高明阳(01370716) on 2017/9/26.
// Copyright © 2017年 高明阳(01370716). All rights reserved.
//
import UIKit
typealias RequestCallBack = (Data?,Error?) ->Void
@objc protocol HTTPConnectionDelegate:NSObjectProtocol {
@objc func finishConnection(data:Data);
@objc func failedConnection(error:Error);
}
class HTTPConnection: NSObject {
var block:RequestCallBack?;
var delegate:HTTPConnectionDelegate?
///类方法
/// get,delegate
class func getRequestWithDelegate(urlStr:String,param:Dictionary<String,AnyObject>?,delegate:HTTPConnectionDelegate){
HTTPConnection().getRequestConnectionWithDelegate(urlStr: urlStr, param: param, delegate: delegate);
}
/// post,delegate
class func postRequestWithDelegate(urlStr:String,param:Dictionary<String,AnyObject>?,delegate:HTTPConnectionDelegate){
HTTPConnection().postRequestConnectionWithDelegate(urlStr: urlStr, param: param, delegate: delegate);
}
/// get,block
class func getRequestWithBlock(urlStr:String,param:Dictionary<String,AnyObject>?,block:@escapingRequestCallBack){
HTTPConnection().getRequestConnectionWithBlock(urlStr: urlStr, param: param, block: block);
}
/// post,delegate
class func postRequestWithBlock(urlStr:String,param:Dictionary<String,AnyObject>?,block:@escapingRequestCallBack){
HTTPConnection().postRequestConnectionWithBlock(urlStr: urlStr, param: param, block: block);
}
///对象方法
/// get,delegate
func getRequestConnectionWithDelegate(urlStr:String,param:Dictionary<String,AnyObject>?,delegate:HTTPConnectionDelegate) -> Void {
self.delegate = delegate;
var myUrlStr:String?;
if param != nil {
let list = NSMutableArray();
for (key ,value) in param! {
let tmp:String ="\(key)=\(value)";
list.add(tmp);
}
let paramStr = list.componentsJoined(by:"&");
myUrlStr = urlStr.appendingFormat("?%@", paramStr);
}else {
myUrlStr = urlStr;
}
print("url:\(myUrlStr!)")
let url = URL(string: myUrlStr!);
let request = URLRequest(url: url!);
let config =URLSessionConfiguration.default;
let session = URLSession(configuration: config);
let task = session.dataTask(with: request) { (data, response, error)in
if error == nil {
let canDo =self.delegate?.responds(to:#selector(HTTPConnectionDelegate.finishConnection(data:)));
if canDo! {
self.delegate!.finishConnection(data: data!);
}
}else {
let canDo = self.delegate?.responds(to:#selector(HTTPConnectionDelegate.failedConnection(error:)));
if canDo! {
self.delegate!.failedConnection(error: error!);
}
}
}
task.resume();
}
/// post,delegate
func postRequestConnectionWithDelegate(urlStr:String,param:Dictionary<String,AnyObject>?,delegate:HTTPConnectionDelegate) -> Void{
self.delegate = delegate;
print("url:\(urlStr)")
let url = URL(string: urlStr);
var request = URLRequest(url: url!);
request.httpMethod ="POST";
if param != nil {
let list = NSMutableArray();
for (key ,value) in param! {
let tmp:String ="\(key)=\(value)";
list.add(tmp);
}
let paramStr = list.componentsJoined(by:"&");
let paramData = paramStr.data(using: .utf8);
request.httpBody = paramData;
}
let config =URLSessionConfiguration.default;
let session = URLSession(configuration: config);
let task = session.dataTask(with: request) { (data, response, error)in
if error == nil {
let canDo =self.delegate?.responds(to:#selector(HTTPConnectionDelegate.finishConnection(data:)));
if canDo! {
self.delegate!.finishConnection(data: data!);
}
}else {
let canDo = self.delegate?.responds(to:#selector(HTTPConnectionDelegate.failedConnection(error:)));
if canDo! {
self.delegate!.failedConnection(error: error!);
}
}
}
task.resume();
}
/// get ,block 回调
//@noescape。简单的介绍就是如果这个闭包是在这个函数结束前内被调用,就是非逃逸的即noescape。
//@escaping 这个闭包是在函数执行完后才被调用,调用的地方超过了这函数的范围,所以叫逃逸闭包。
func getRequestConnectionWithBlock(urlStr:String,param:Dictionary<String,AnyObject>?,block:@escapingRequestCallBack) -> Void {
self.block = block;
var myUrlStr:String!
if param != nil {
let list = NSMutableArray();
for (key ,value) in param! {
let tmp:String ="\(key)=\(value)";
list.add(tmp);
}
let paramStr = list.componentsJoined(by:"&");
myUrlStr = urlStr.appendingFormat("?%@", paramStr);
}else {
myUrlStr = urlStr;
}
print("url:\(myUrlStr!)")
let url = URL(string: myUrlStr!);
let request = URLRequest(url: url!);
let config =URLSessionConfiguration.default;
let session = URLSession(configuration: config);
let task = session.dataTask(with: request) { (data, response, error)in
self.block?(data,error);
}
task.resume();
}
/// post,block
func postRequestConnectionWithBlock(urlStr:String,param:Dictionary<String,AnyObject>?,block:@escapingRequestCallBack) -> Void {
self.block = block;
print("url:\(urlStr)")
let url = URL(string: urlStr);
var request = URLRequest(url: url!);
request.httpMethod ="POST";
if param != nil {
let list = NSMutableArray();
for (key ,value) in param! {
let tmp:String ="\(key)=\(value)";
list.add(tmp);
}
let paramStr = list.componentsJoined(by:"&");
let paramData = paramStr.data(using: .utf8);
request.httpBody = paramData;
}
let config =URLSessionConfiguration.default;
let session = URLSession(configuration: config);
let task = session.dataTask(with: request) { (data, response, error)in
self.block?(data,error);
}
task.resume();
}
}
====================================================
//
// ViewController.swift
// Swift4HttpConnectionDemo
//
// Created by 高明阳(01370716) on 2017/9/26.
// Copyright © 2017年 高明阳(01370716). All rights reserved.
//
import UIKit
class ViewController: UIViewController ,HTTPConnectionDelegate{
override func viewDidLoad() {
super.viewDidLoad()
// https://facebook.github.io/react-native/movies.json
// HTTPConnection.getRequestWithDelegate(urlStr: "https://facebook.github.io/react-native/movies.json", param: nil, delegate: self);
// HTTPConnection.postRequestWithDelegate(urlStr: "https://facebook.github.io/react-native/movies.json", param: nil, delegate: self);
// HTTPConnection.getRequestWithBlock(urlStr: "https://facebook.github.io/react-native/movies.json", param: nil) { (data, error) in
// if error != nil {
// print("error:\(error!)")
// }else {
// let str = String(data: data!, encoding: .utf8);
// print("data:\(str!)");
// }
// };
HTTPConnection.postRequestWithBlock(urlStr:"https://facebook.github.io/react-native/movies.json", param:nil) { (data, error) in
if error !=nil {
print("error:\(error!)")
}else {
let str =String(data: data!, encoding: .utf8);
print("data:\(str!)");
}
};
}
//MARK:HTTPConnectionDelegate
func finishConnection(data:Data) {
print("finishConnection");
let str:String! =String(data: data, encoding: .utf8);
print("data:\(str!)");
}
func failedConnection(error:Error) {
print("failedConnection:\(error)")
}
}
- swift4初探之网络请求
- RxJava 初探(网络请求)
- 网络编程之初探
- Swift4
- Swift4
- Swift4
- Swift4
- swift4
- Swift4之NSAttributedString的使用
- Swift之网络请求
- 请求网络之HttpUrlConnection
- 网络请求之HttpClient
- xUtils之网络请求
- 网络请求之RestFul
- 网络请求之-NSURLConnection
- 网络请求之-AFNetworking
- 网络请求之-NSURLSeesion
- Swift4学习笔记-1.3 Swift之旅
- Java中多线程知识整理_01
- allocator类
- Transactional 2
- Kafka安装与入门实例
- Django基础,Day2
- swift4初探之网络请求
- usaco Friday the Thirteenth
- 上机练习2 类与对象
- 1-9:MysqL--合计函数-count
- (POJ
- 1071 小赌怡情
- 自然语言---哈夫曼树
- Non-overlapping Intervals问题及解法
- Mybatis sql 转义字符