本文主要记录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. jenkins构建时报错

    配置好项目后,选择立即构建,报错 由于节点管理配置的太低,或者在节点的用法上 选择了不同的方式 解决办法: 1.尽可能的使用这个节点 2.保证配置过程没有错误.

  2. .NET中的FileUpload控件的使用-Jquery(一)

    FileUpload在HTML中是个常用的基础控件,在涉及到上传各种格式的文件时候都会用到:笔者前段时间正好用到它做上传功能,记录下来做一些累积, 前端到后台用的是的Jquery中的Ajax进行数据传 ...

  3. Aspose Word.Dll库自带的bug导致The document appears to be corrupted and cannot be loaded 问题处理。

    问题的详细描述: C#在开发过程中使用Aspose.word.dll库去实现word套打功能.但是,最近客户反映出现了一个问题,在打印文档的时候,系统报错.经过定位分析发现是Aspose.word.d ...

  4. 开发 C# OPC 客户端

    编写 opc 客户端的思路 1. 使用OPC Client浏览服务器, 查看测试代码修改后的结果. 2. 根据OPC Client搜集到的服务器信息编写代码和服务器交互 3. OPC Client 操 ...

  5. asp.net mvc+httpclient+asp.net mvc api入门篇

    第一步:创建一个ASP.NET MVC API项目 第二步:在api项目里面创建一个类 public class Student { public int Id { get; set; } publi ...

  6. 给Ubuntu18.04安装mac os主题<转载>

     给Ubuntu18.04安装mac os主题 转载来自 https://www.cnblogs.com/feipeng8848(作者) 参考文献 https://linuxhint.com/gnom ...

  7. Android必学之AsyncTask

    AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程. .为什么需要使用异步任务 ...

  8. 为什么需要jQuery Mobile

        1.没有所谓的移动互联网,只有一个互联网     2.设计移动网站不需要什么特别处理     3.一个站点应当在所有设备(台式机.手机.电视)上都能运转     jQuery Mobile诞生 ...

  9. [Umbraco] 在umbraco中开发xlst的小窍门

    当你在umbraco开发xslt时也可以调用C#里的方法,具体方法参考如下 点击第二个按钮 点击右侧的"Get Extensions" 系统自带了工具类,里面有很多常用也很实用的方 ...

  10. vs2017 对dockerfile的支持

    项目添加 dockerfile Docker file 内容 FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXP ...