本文主要记录swift中delegate的使用、“?!”Optional的概念、GCD的使用、request请求、网络加载图片并保存到沙箱、闭包以及桥接。


一、delegate的使用

swift中delegate的使用和objective-c大同小异,简单记录一下:

  step1:声明

@objc protocol testProtocol:NSObjectProtocol{
@objc optional func testAdd( a:Int, b:Int) -> Int; }

  step2:实例化

class TextFieldViewController: UIViewController ,UITextFieldDelegate{
var delegate:testProtocol!
}

  step3:调用delegate响应(此处没有处理delegate为空的情况,因为使用了“?”,当delegate为nil的时候,后面的testAdd不会被执行)

//        if (self.delegate != nil)&&(self.delegate?.responds(to:#selector(testProtocol.testAdd(a:b:))))!{
//            let result = self.delegate!.testAdd!(a: 2, b: 5)
//            print(result)
//        }
        let result = self.delegate?.testAdd!(a: 3, b: 1)
        print(result ?? "delegate没有响应")

  step4:其他类遵循并实现协议

class UIBaseViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,testProtocol{
func testAdd( a:Int, b:Int) -> Int{
print(a+b)
return a+b
}
func jump{
let txtVC = TextFieldViewController()
txtVC.delegate = self
self.navigationController?.pushViewController(txtVC, animated: true)
}
}

二、“? !”的使用和含义

详细深层的理解,请Google,百度,下面简单记录使用时的区别

            self.navigationController?.pushViewController(txtVC, animated: true)

上面的“?”处理逻辑是,当navigationController为nil时直接不执行后面的push操作,当navigationController存在时执行后面的push操作。

self.navigationController!.pushViewController(txtVC, animated: true)

上面的“!”对UINavigationController?进行了手动解包,也就是说navigationController绝对存在,否则(navigationController为nil)程序就会直接崩溃。

三、GCD使用

  

  1、同步

    func dispatch_sync(){
let queue = DispatchQueue(label: "com.test.queuesync")
queue.sync {
for i in ...{
print("sync test --- ",i)
}
print(" ---同步执行结束 子线程---")
}
}

  

  2、异步

    func dispatch_async(){
let queue = DispatchQueue(label: "com.test.queueasync")
queue.async {
for i in ...{
print("async test --- ",i)
}
print(" ---异步执行结束 子线程---")
}
}

  

  3、延时

    func dispatch_delay(){
let queue = DispatchQueue(label: "com.test.queuedelay")
queue.asyncAfter(deadline: DispatchTime.now()+DispatchTimeInterval.seconds(), execute: { print(" ---延迟执行执行结束 子线程---")
})
}

  

  4、回到主线程

    func dispatch_main(){

        let queue = DispatchQueue(label: "com.test.backtomain")
queue.async{
DispatchQueue.main.sync {
print(" ---回到主线程---")
}
}
}

  5、全局并发队列

        func dispatch_global(){
let queue = DispatchQueue.global()
let workItem = DispatchWorkItem{
print("调用了workitem")
}
queue.async {
for i in ...{
print("async test --- ",i)
}
workItem.perform();
print(" ---global异步执行结束 子线程---")
}
}

四、request

  

  1、GET请求

    func getRequest(){
let url = URL.init(string: "https://api.github.com/repos/alibaba/weex")
let request = NSMutableURLRequest.init(url:url!) request.httpMethod = "GET" request.timeoutInterval =
// let params = "type=shentong&postid=3333557693903" as NSString
// request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
// request.httpBody = params.data(using: String.Encoding.utf8.rawValue) let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
if (error != nil) {
print(error ?? "")
return
}else {
//此处是具体的解析,具体请移步下面
do{
let json = try JSONSerialization.jsonObject(with: data!, options: [])
print(json)
// let json: Any = try! JSONSerialization.jsonObject(with: data!, options: [])
// print(json)
JYToast.showInMidWindow(title: NSString.init(format: "data is -- \n %@", json as! CVarArg) as String)
}catch{
print(error.localizedDescription)
} }
}
dataTask.resume() }

  

  2、POST请求

func postRequest(){
let url = URL.init(string: "http://www.kuaidi100.com/query")
let request = NSMutableURLRequest.init(url:url!) request.httpMethod = "POST"
request.timeoutInterval =
let params = "type=shentong&postid=3333557693903" as NSString
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpBody = params.data(using: String.Encoding.utf8.rawValue) let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
if (error != nil) {
print(error ?? "")
JYToast.showInMidWindow(title: NSString.init(format: "error is -- \n %@", error! as CVarArg) as String)
return
}else {
do{
let json = try JSONSerialization.jsonObject(with: data!, options: [])
print(json)
JYToast.showInMidWindow(title: NSString.init(format: "data is -- \n %@", json as! CVarArg) as String)
}catch{
print(error.localizedDescription) }
}
}
dataTask.resume()
}

五、加载网络图片并保存到沙箱

let queue = DispatchQueue.global();

queue.async {

let data = NSData.init(contentsOf: NSURL.init(string: "http://c.hiphotos.baidu.com/image/h%3D300/sign=58adc7aa3c2ac65c78056073cbf3b21d/3b292df5e0fe9925de1b729a3da85edf8cb171e0.jpg")! as URL)
let image = UIImage.init(data: data! as Data)
let doc = NSHomeDirectory() as NSString
doc.appendingPathComponent("Documents/1.jpg")

do{
try data?.write(toFile: doc.appendingPathComponent("Documents/1.jpg"), options: NSData.WritingOptions.atomic)
}catch{
print(error.localizedDescription)
}

let main = DispatchQueue.main
main.async {
let imageView = UIImageView.init(frame: CGRect.init(x: , y: , width: , height: ))
imageView.image = image
self.view.addSubview(imageView)
}
}

六、闭包

  闭包和block类似,有逃逸闭包和非逃逸闭包之分

//起别名
typealias AlertHandler = (_ action:UIAlertAction) -> () class JYShowAlert: NSObject {
// 作为参数
class func showAlert(alertTitle:String,message:String,actionTitle:String,handler:@escaping AlertHandler){
let alertVC = UIAlertController.init(title:alertTitle, message: message, preferredStyle: UIAlertControllerStyle.alert)
let confirm = UIAlertAction.init(title: actionTitle, style: UIAlertActionStyle.cancel, handler: handler)
alertVC.addAction(confirm)
let rootVC = UIApplication.shared.keyWindow?.rootViewController
if ((rootVC?.presentedViewController) != nil){
rootVC?.presentedViewController?.present(alertVC, animated: true, completion: nil)
}else{
rootVC?.present(alertVC, animated: true, completion: nil)
} } }

七、桥接文件

  1、新建header-file

  2、如下图导入

  3、在文件中加入需要桥接的objective-c的头文件即可

swift 基础小结01 --delegate、Optional、GCD的使用、request请求、网络加载图片并保存到沙箱、闭包以及桥接的更多相关文章

  1. android 加载图片oom若干方案小结

    本文根据网上提供的一些技术方案加上自己实际开发中遇到的情况小结. 众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视手机而定).一般我们可以通过获取当 ...

  2. ios基础篇(二十八)—— UITableView的上拉加载

    本文主要展示一个demo实现UITableView的上拉加载数据: 先看看效果图: 接着上拉,加载更多数据: 主要实现的效果是在我们上拉结束拖拽之后,开始加载数据,数据加载的过程中有滚动轮提示用户正在 ...

  3. Webpack探索【15】--- 基础构建原理详解(模块如何被组建&如何加载)&源码解读

    本文主要说明Webpack模块构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack的基础构建原理. 本文使用的W ...

  4. [Swift通天遁地]一、超级工具-(5)使用UIWebView(网页视图)加载本地页面并调用JavaScript(脚本)代码

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. [Swift通天遁地]一、超级工具-(4)使用UIWebView(网页视图)加载HTML和Gif动画

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. [Swift通天遁地]一、超级工具-(11)使用EZLoadingActivity制作Loading加载等待动画

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. Swift基础小结_2

    import Foundation // MARK: - ?和!的区别// ?代表可选类型,实质上是枚举类型,里面有None和Some两种类型,其实nil相当于OPtional.None,如果非nil ...

  8. Swift基础学习01

    相关网站:http://www.cnblogs.com/tt_mc/p/3871295.html   相关辅助操作: 可以在右边直接查看输出值   可能出现的常见问题: 1.凡是=注意左右间距一样 2 ...

  9. 学习swift从青铜到王者之swift基础部分01

    1.1 变量和常量 var 变量名称 = 值(var可以修改) let 常量名称 = 值(let不可以修改) 1.2 基本数据类型 整数类型和小数类型 两种基本数据类型不可以进行隐式转换 var in ...

随机推荐

  1. .net core 部署 docker (CentOS7)

    最近研究 docker 在Linux 下部署 .net core 项目,在过程中踩了很多坑,网上的资料对我帮助确实大,但有些问题未指明出来. 特地整理一份在发布文档 本文使用的是 root 账号操作, ...

  2. Microsoft.Office.Interop.Excel.ApplicationClass can not embedded 的问题

    用c#进行开发时,要做一个excel导入功能,期间使用到Microsoft.Office.Interop.Excel程序集,在用vs2008开发的时候没有报错,将这个程序集引用到vs2010的时候,便 ...

  3. 静态工厂 + DbHelper

    在 .NET 的学习过程中用过三种数据库:Sql Server.Access.SQLite.Sql Server 用得相对多一点点,但是,麻烦,每次用它都需要开服务,而且还费资源,更麻烦的是拷贝到一台 ...

  4. windform 重绘Treeview "+-"号图标

    模仿wind系统界面,重绘Treeview + - 号图标 一,首先需要图片 ,用于替换原有的 +-号 二.新建Tree扩展类 TreeViewEx继承TreeView using System; u ...

  5. Android------------------系统服务调用的学习

    一.ServiceManager的方法: 此方法getService,用于根据名称获取当前的IBinder的代理(并没有直接获取服务), 服务提供的功能是依靠IBinder间接调用的(返回值IBind ...

  6. “全栈2019”Java多线程第二十九章:可重入锁与不可重入锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. 《Python黑帽子:黑客与渗透测试编程之道》 自动化攻击取证

    工具安装: 下载源码:https://code.google.com/archive/p/volatility/downloads 工具配置: 获取内存镜像:https://www.downloadc ...

  8. InfluxDB Java入门

    添加依赖 <dependency> <groupId>org.influxdb</groupId> <artifactId>influxdb-java& ...

  9. javascript之快速排序

    快速排序思想其实还是挺简单的,分三步走: 1.在数组中找到基准点,其他数与之比较. 2.建立两个数组,小于基准点的数存储在左边数组,大于基准点的数存储在右边数组. 3.拼接数组,然后左边数组与右边数组 ...

  10. Caffe 使用记录(一)mnist手写数字识别

    1. 运行它 1. 安装caffe请参考 http://www.cnblogs.com/xuanyuyt/p/5726926.html  此例子在官网 http://caffe.berkeleyvis ...