Swift 核心技术与实战
张杰
美团点评高级技术专家
20981 人已学习
新⼈⾸单¥59
课程目录
已完结/共 120 讲
第十三章:Swift和Objective-C混合编程 (4讲)
Swift 核心技术与实战
登录|注册
留言
7
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 86 | 实践出真知:多线程典型应用场景分析
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | Swift版本历史和各版本特性快览
04 | Swift和Objective-C的主要区别
05 | swiftc:强大的命令行工具
06 | REPL:Swift交互式解释器
07 | Playground:Swift学习的乐园
08 | 如何在Swift中定义常量和变量
09 | Swift中的数值类型
10 | 如何使用Tuple组合多个值
11 | 如何在Swift中使用Optional
12 | Optional实现原理探究
13 | 如何在Swift中创建和初始化字符串
14 | Swift字符串的常见操作
15 | 如何使用索引访问和修改字符串
16 | 如何在Swift中获取子串和进行字符串比较
17 | 赋值和算数运算符
18 | 在Swift里如何处理算术结果溢出
19 | 为了Optional:合并空值运算符
20 | Swift的新宠:区间运算符
21 | 强大的位运算符
22 | 位运算符应用举例(1)
23 | 位运算符应用举例(2)
24 | 运算符优先级和结合性
25 | 如何为类和结构体自定义运算符实现
26 | 如在Swift中定义自己的运算符
27 | 如何在Swift里进行循环控制
28 | 更加强大的switch
29 | 如何在Swift里进行控制转移
30 | 如何使用guard来改善你的条件判断
31 | Swift中的模式和模式匹配
32 | 在Swift中创建数组的N种方式
33 | 访问和操作数组:遍历和索引
34 | 访问和操作数组:查找操作
35 | 访问和操作数组:添加和删除
36 | 访问和操作数组:ArraySlice
37 | 访问和操作数组:重排操作
38丨访问和操作数组:拼接操作
39丨深入理解数组:底层实现探究
40丨如何用数组来实现栈和队列
41丨Set:定义和创建
42丨Set:访问和修改
43丨Set:执行Set计算和判断
44 | 实现自己的集合算法
45 | 深入理解集合:底层实现探究
46 | Dictionary:Swift中的字典类型
47 | 字典的常见操作
48 | 深入理解字典:底层实现探究
49 | Swift中如何定义和使用函数
50 | 函数的形式参数和返回值
51 | 函数类型和内嵌函数
52 | 闭包和闭包表达式
53 | 闭包捕获值
54 | 逃逸闭包和自动闭包
55 | 如何使用Swift中的高阶函数
56 | 函数式编程(1)
57 | 函数式编程(2)
58 | Swift面向对象概述
59 | 枚举从此站起来了
60 | 如何为类、结构体以及枚举添加属性
61 | 如何为类、结构体以及枚举添加方法
62 | 像访问数组和字典一样访问类和结构体:下标和下标重载
63 | 如何进行类的初始化和反初始化
64 | 如何在Swift中实现继承
65 | 如何在Swift中实现多态和进行类型转换
66 | 如何为现有的类、结构体、枚举或协议添加新功能
67丨Swift中的协议
68丨协议和扩展
69丨面向协议编程初探(1)
70丨面向协议编程初探(2)
71丨泛型的发展历史与泛型的概述
72丨如何在Swift中定义泛型函数
73丨如何在Swift中定义泛型类型
74丨Swift泛型中的类型约束
75 | 为了协议:关联类型
76 | 如何为泛型定义要求:where字句
77 | 泛型下标
78丨泛型编程思想浅谈
79 | 如何在Swift中创建一个线程
80 | 更高级的抽象:Cocoa Operation
81丨多线程编程新思路:GCD概览
82 | 如何使用GCD:基本操作指南
83 | 深度使用GCD:高级特性指南
84 | 深入理解GCD:源码剖析
85 | 如何保证线程安全和同步
86 | 实践出真知:多线程典型应用场景分析
87 | 拓宽思路:其他常见的多线程编程模式
88 | SwiftUI:Apple全新的UI框架
89 | SwiftUI设计工具使用指南
90 | 如何使用SwiftUI构建可复用的组件
91 | 如何用SwiftUI实现动画
92 | 深入理解SwiftUI:实现原理探秘
93 | 如何在Swift里进行错误处理
94 | Swift中代码访问权限控制
95 | 不透明类型
96 | Swift中的自动引用计数
97 | Swift中的内存安全性
98 | 如何在项目中进行网络请求
99 | 如何进行JSON的序列化和反序列化
100 | 没有最方便,只有更方便:对Swift标准库的一些扩展
101 | 如何在Swift中进行自动布局
102 | 如何进行图片加载和缓存
103 | 以一种优雅安全的方式使用资源文件
104 | 如何在项目中将内容分享到社交平台
105 | Swift和Objective-C的运行时简介
106 | 桥接问题
107 | 如何在Swift和Objective-C中相互调用
108 | Swift和Objective-C混合编程踩坑指南
109 | 如何搭建一个iOS Swift工程
110 | 商城整体架构、UI设计和模块拆分
111 | 编写mock API
112 | 登录注册页模块开发
113 | 商城列表页模块开发
114 | 商城详情页模块开发
115 | 商城个人中心页模块开发
116 | 商城订单页模块开发
117 | 结束语
118|加餐1:可选链
119|加餐2:Swift KVC
120|加餐3:Swift面试中的要点注意事项&结课测试
登录 后留言

全部留言(7)

  • 最新
  • 精选
muzzy
读取操作为什么不用async异步读取呢

作者回复: 我们要返回值,这里简便的用了sync。 async也是可以的,不过你也要用信号量等方式等async取到数据再返回

2020-03-18
老杨
请问为什么我按照视频来写的代码,最后运行结果还是有很多-1呢?我的代码如下: let queue = DispatchQueue(label: "myQueue", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil) let queue2 = DispatchQueue(label: "myQueue2", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil) let arrayQueue = DispatchQueue(label: "myQueue3", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil) var array = Array(1...1000) func getLastItem() -> Int { return arrayQueue.sync { () -> Int in if array.count > 0 { return array[array.count - 1] } return -1 } } func removeLastItem() { let workItem = DispatchWorkItem(qos: DispatchQoS.default, flags: DispatchWorkItemFlags.barrier) { array.removeLast() } arrayQueue.async(execute: workItem) } queue.async { for _ in 0..<1000 { removeLastItem() } } queue2.async { for _ in 0..<1000 { print(getLastItem()) } }

作者回复: 是正常的,这个示例多线程运行每一次结果都不一样,依赖你的硬件、当时系统状态等等

2019-11-29
2
小千
/*** 编写一个多线程下载器,可以执行多个下载任务,每个任务可以保持当下下载字节数、总字节数,可以设置回调得到当前下载进度 ***/ /*** 利用Operation可子类化,定义自己属性和状态,实现复杂逻辑,保存业务状态的特点 ***/ // 自定义下载的Operation子类 class DownloadOperation: Operation { let urlString: String var currentBytes = 0 var totalBytes = 0 var progressChanged: ((Float)->Void)? init(urlString:String){ self.urlString = urlString super.init() } // 重写main,实现下载逻辑 override func main() { guard !isCancelled else { return } /*以下为模拟下载,实际场景根据不同下载方式来实现*/ // 随机假设总字节(1000-10000) totalBytes = Int(1000 + arc4random()%(5000)) let random = Int(8 + arc4random()%(15)) let temp = totalBytes/random // 模拟下载过程的进度变化 while currentBytes < totalBytes { sleep(1) currentBytes += temp currentBytes = currentBytes>totalBytes ? totalBytes : currentBytes progressChanged?( Float(currentBytes)/Float(totalBytes) ) } } } // 创建queue let queue = OperationQueue() let urlStrs = ["url1","url2","url3"] // 添加任务到queue中 for str in urlStrs { let operation = DownloadOperation(urlString: str) operation.progressChanged = { progress in print("下载\(str),总字节数\(operation.totalBytes),已下载\(operation.currentBytes),进度:\(Int(progress*100))%") } operation.completionBlock = { print(">>>>>> 下载\(str)完成 <<<<<<<<") } queue.addOperation(operation) } /** 下载url1,总字节数3567,已下载198,进度:5% 下载url3,总字节数2883,已下载131,进度:4% 下载url2,总字节数3224,已下载322,进度:9% ... 下载url3,总字节数2883,已下载1441,进度:49% 下载url1,总字节数3567,已下载2178,进度:61% 下载url2,总字节数3224,已下载3224,进度:100% >>>>>> 下载url2完成 <<<<<<<< … 下载url3,总字节数2883,已下载2489,进度:86% 下载url1,总字节数3567,已下载3567,进度:100% >>>>>> 下载url1完成 <<<<<<<< ... 下载url3,总字节数2883,已下载2882,进度:99% 下载url3,总字节数2883,已下载2883,进度:100% >>>>>> 下载url3完成 <<<<<<<< */
2020-08-19
1
4
小千
/*** 一个页面三个网络请求,需要在三个网络请求都返回的时候刷新界面 ***/ /*** 使用OperationQueue+Operation+Dependency ***/ // 创建用于请求数据的BlockOperation let requestOperation = BlockOperation() // 添加多个请求的block requestOperation.addExecutionBlock { sleep(1) print("接口1数据请求完成") } requestOperation.addExecutionBlock { sleep(1) print("接口2数据请求完成") } requestOperation.addExecutionBlock { sleep(1) print("接口3数据请求完成") } // 创建用于刷新界面的BlockOperation let refreshOperation = BlockOperation { print("3个接口数据请求完成,刷新界面!") } // 添加依赖 refreshOperation.addDependency(requestOperation) let queue = OperationQueue() // 将Operation加入到queue queue.addOperations([requestOperation, refreshOperation], waitUntilFinished: false) print("开始执行!”) /** 开始执行! 接口2数据请求完成 接口3数据请求完成 接口1数据请求完成 3个接口数据请求完成,刷新界面! */
2020-08-19
1
3
风早
func getLastItem() -> Int { return arrayQueue.sync { () -> Int in if array.count > 0 { return array[array.count - 1] } return -1 } } arrayQueue.sync是并发的吗 ?sync不是同步的吗
2021-10-22
1
畅畅
多线程读写,读操作大于写操作,是否可以使用CopyOnWrite(写入时复制)思想来实现
2022-07-29
风早
希望老师开新的课程,比如如何分析崩溃,如何调试,runloop啊 等等一些进阶课程。
2021-10-21
收起评论