我们生活在一个繁忙的世界里,当我们需要查找文件和数据时,使用 ls 命令可以节省时间和精力。但如果不经过大量调整,默认的 ls 输出并不十分舒心。...这个工具是用 Rust 编写的,该语言以并行性和安全性而闻名。...它使用颜色来区分文件类型和元数据。它能识别符号链接、扩展属性和 Git。而且它体积小、速度快,只有一个二进制文件。 跟踪文件 你可以使用 exa 来跟踪某个 Git 仓库中新增的文件。...image.png 我相信 `exa 是最简单、最容易适应的工具之一。它帮助我跟踪了很多 Git 和 Maven 文件。...它的颜色编码让我更容易在多个子目录中进行搜索,它还能帮助我了解当前的 xattrs。
在构建应用程序时,在主线程上执行UI更新任务是很重要的,在使用几个后台线程时,这有时会很有挑战性。使用@MainActor属性将帮助你确保你的UI总是在主线程上更新。...如果您不熟悉 Swift 中的 Actors,我建议您阅读我的文章Swift中的Actors 使用以如何及防止数据竞争,全局Actors的行为类似于Actors,我不会在这篇文章中详细介绍Actors的工作方式...MainActor 是一个全局唯一的 Actor,他在主线程上执行他的任务。它应该被用于属性、方法、实例和闭包,以在主线程上执行任务。...} } 换句话说,不再需要使用 DispatchQueue.main.async了。...我应该在什么时候使用MainActor属性? 在 Swift 5.5 之前,你可能定义了很多调度语句,以确保任务在主线程上运行。
如果说 Publisher 决定了发布什么样的 (what) 数据的话,Scheduler(调度器) 所要解决的就是两个问题:在什么地方 (where),以及在什么时候 (when) 来发布数据和接收数据...我们都知道,在 iOS 开发中如果需要更新 UI,需要保证相关操作发生在主线程。...在 Combine 中如果数据流前面的 Publisher 是在后台线程进行操作,那么在订阅时,当状态的变化会更新 UI 时,需要将数据流中接收数据的线程切换到主线程。...:立即执行同步操作, 如果使用它执行延迟的工作,会报错。...使用RunLoop.main, DispatchQueue.main和OperationQueue.main来执行与 UI 相关的操作。
为了解决这个问题,我们可以使用 DispatchQueue.main 和 threads。 在本教程中,我们将学习什么是调度器,以及我们如何在iOS应用开发中使用它们来管理队列和循环。...上面的代码块是在主线程上运行的。 RunLoop RunLoop 调度器用于在一个特定的运行循环上执行任务。在运行循环上的行动可能是不安全的,因为 RunLoops 不是线程安全的。...切换调度器 在使用 Combine 的 iOS 开发中,许多消耗资源的任务都是在后台完成的,以防止应用程序的 UI 冻结或完全崩溃。然后,Combine 切换调度器,使任务的结果在主线程上执行。...name = null} Received e on thread {number = 7, name = null} 在上面的代码块中,这些值是从不同的线程而不是主线程发出的...现在,发布者不会因为阻塞我们的主线程而冻结我们的应用程序。 总结 在这篇文章中,我们回顾了什么是调度器以及它们如何在 iOS 应用程序中工作。
前言 Hi Coder,我是 CoderStar! 今天给大家带来多线程系列的第二篇文章 -- GCD,其大概率是我们在使用多线程时最常用的方式了。...对开发者而言,面对的不再是上一篇文章iOS 多线程-Thread所描述的线程,CGD 将线程概念模糊掉,开发者转而面对的是更上层的队列和任务,不再需要考虑线程的周期以及调度等等,这些交由 GCD 内部处理就好...GCD层次图 qos 属性扩展 如果大家对上次的iOS 多线程-Thread还有印象的话,想必会对Thread的qualityOfService属性有点印象,其类型为QualityOfService;iOS...---- QoS 覆盖信息 noQoS // 不指定 QoS,由调用线程或队列来指定。 inheritQoS // DispatchWorkItem 会采用队列的 QoS class,而不是当前的。...enforceQoS // DispatchWorkItem 会采用当前的 QoS class,而不是队列的。 那DispatchWorkItem与普通闭包方式有哪些区别呢?
所以dispatch_after不会阻塞当前任务,并不是先把任务加到线程里面,等时间到了在执行。而是等时间了,才加入到线程中。 我们使用两种时间格式来看看。...如果需要循环的任务里面有特别耗时的操作,我们上一篇文章里面说是应该放在global里面的。如何避免在主线程操作这个呐??? 来,给三秒时间想想。...看到调用这个方法的时候是不是就是在UI线程里面这么写下来的嘛?那就开启一个gloablQueue,让它来进行不就好了嘛!BINGO! 这位同学,你已经深得真谛,可以放学后到我家后花园来了。...iOS多线程系列之三:使用GCD实现异步下载图片。 好奇宝宝们有没有想过,在创建信号量的时候初始值设置成2或者更大的数,例如50,会是什么效果? 自己敲敲代码试试喽,想想看。...两个任务都是多线程,我们其实并不知道什么时候才能执行完毕。这个时候,就可以靠信号量,让大家互相等待。 为了更简化这个过程,例子里面模拟了一个在另外一个方法中需要耗时1秒的一个操作。
我们之前已经讲过 iOS 多线程-Thread 以及 iOS 多线程-GCD,我们今天来聊一聊 iOS 多线程中最后一种比较常用的方式--Operation。...的存在,同一个 Queue 的 Operation 之间有优先级,所以先进入 Queue 的 Operation 不一定先运行,所以当maxConcurrentOperationCount设置为 1 时并不是一个真正意义上的串行队列...1、从两者所在层次来讲:GCD 底层是 C 语言的 API,而 Operation 是 GCD 基础上更高层次的抽象,那 GCD 相对 Operation 来说肯定是又快又轻的。...(Operation 在使用 GCD API 的基础上还会加上一些锁用来保证线程安全) 但是反过来说因为 Operation 是更高层次的抽象,按照一般的经验法则来看,我们应首先使用最高级别的 API,...*))出来之后,从一定意义上讲,DispatchWorkItem可以类比到Operation对象,DispatchQueue可以类比到OperationQueue对象。
我应该在什么时候使用 Sendable? Sendable协议和闭包表明那些传递的值的公共API是否线程安全的向编译器传递了值。...换句话说,该类文章(Article)的传递不是线程安全的,所以编译器不能隐式地将其标记为遵守Sendable协议。...由于我们给自己和同事增加了额外的责任,我不鼓励使用这个属性,建议使用组合、最终类或值类型来实现我们的目的。 如何使用 @Sendabele 函数可以跨并发域传递,因此也需要可发送的一致性。...在我的例子中,我有一个与SWHighlight有关的警告,它不符合Sendable,而苹果在他们的SharedWithYou框架中定义了它。...,而只是禁用了它们。
使用 Sendable 应该在什么时候使用 Sendable? Sendable协议和闭包表明那些传递的值的公共API是否线程安全的向编译器传递了值。...换句话说,该类文章(Article)的传递不是线程安全的,所以编译器不能隐式地将其标记为遵守Sendable协议。...由于我们给自己和同事增加了额外的责任,我不鼓励使用这个属性,建议使用组合、最终类或值类型来实现我们的目的。 如何使用 @Sendabele 函数可以跨并发域传递,因此也需要可发送的一致性。...在我的例子中,我有一个与SWHighlight有关的警告,它不符合Sendable,而苹果在他们的SharedWithYou框架中定义了它。...,而只是禁用了它们。
于是果断的决定这个系列不出意外,基本上就用Swift来写了。如果有特别强烈要求的同学,打算重金打赏宅胖两块钱要求提供OC源代码的,我也会毫无底线的答应这个无理高瞻远瞩、英明神武的要求。 ?...嗯,我说的是正常情况下。当然还是有不正常情况啊,例如使用iOS提供的极少数的几种进程间通讯的工具。 1.2 线程 线程:进程想要执行任务,必须要有线程,每个进程至少有一条线程。 线程就是用来干活的。...中的多线程 刚才说了,iOS App一旦运行,默认就会开启一条线程。...这个是苹果推荐使用的一种多线程技术,好处是不用关心线程及线程的生命周期。 ? image.png 看完这个导图,是不是确实觉得Operation简单?属性、方法没有那么多。...Swift中出现了可选值这么一个东西,这个不是这次的重点。想深入了解的童鞋可以参看这篇:Swift可选值(Optional Values)介绍:?和!使用总结 。感谢@kmplayer 童鞋。
主队列 特殊的串行队列,会在主线程上执行任务。...DispatchQueue 主队列 // 主队列 let main = DispatchQueue.main 串行队列 // label:队列的名称 // 除label以外的参数都使用默认值时,返回的是串行队列...执行任务一") } op.start() maxConcurrentOperationCount 设置 OperationQueue 的最大并发数,表示的是能同时执行的 Operation 的最大数量,而不是开启线程的最大数量...它的特点是同一个线程可以加锁 N 次而不会引发死锁。...iOS 规定不能在子线程中更新 UI 界面,更新 UI 的操作必须在主线程中进行。
应用程序使用多核的传统方法是创建多个线程。与依赖线程不同,iOS 采用异步设计方法来解决并发问题。...通常,这项工作涉及获取一个后台线程,在该线程上启动所需的任务,然后在任务完成时向调用方发送通知(通常通过一个回调函数)。 iOS 提供了一些技术,允许您异步执行任何任务,而无需自己管理线程。...相比较 GCD 使用更加简单,并且提供了一些用 GCD 不是很好实现的功能。是苹果公司推荐使用的并发技术。...更常见的做法是取消所有队列操作,以响应某些重要事件,如应用程序退出或用户专门请求取消,而不是有选择地取消操作。...如果操作对象的执行顺序对您很重要,那么您应该在将操作添加到队列之前使用 依赖关系 建立该顺序,或改用 GCD 的 串行队列 实现序列化效果。
FaceID和TouchID本身代码很简单,使用起来也很容易,主要是逻辑的嵌套相对复杂。...状态很多但不是所有状态都需要处理和提示,故没有列出所有枚举 enum LocalAuthStatus : Int { case success //成功 case...注:支持FaceID的设备出厂最低系统版本就是iOS11.0所以,在iOS11以下只要硬件支持,则只有TouchID一种。...优点:用户在单次使用后就可以取消验证。...if let _ = authContent.evaluatedPolicyDomainState { //如果不放在主线程回调可能会有
需要实现的需求如下: 首次登录使用密码或第三方登录 登录完成后开启生物验证 对已开启生物验证的用户可免密登录 可使用多设备登录 用户token密文传输(RSA加密) 可在无网络的情况下个人信息的展示 需求整理完之后我想说产品你...涉及到知识点: 接入三方登录(友盟等平台有成熟的方案,不是本文讨论的重点) touchID、faceID keychain RSA加密 本地缓存,安全起见我选择NSKeyedArchiver(归档) 明确了目标就开始搞...NSKeyedArchiver 这个也是iOS中比较基础的数据本地化方案,因为Apple对数据会做加密然后写成文件,安全性相对较高,个人信息推荐使用这种方式来缓存。...一定要注意这个坑我补了好久,放出最基本的代码 //归档 if #available(iOS 11.0, *) { do { let data = try NSKeyedArchiver.archivedData...本人试过很多版本,也尝试着去了解RSA这个非对称加密,在iOS系统中用Security库来实现加密算法。 其实只要了解该加密算法是使用一对秘钥,公钥是用来加密的,私钥是用来解密的就好了。
startTestBtnAction override func removeFromDataImageArray() -> Void { // 我们使用多个线程去删除一个数组里面的东西...NSCondition条件锁,首先它也是遵循NSLocking协议的,这点和我们上面说的NSLock是一致的,所以它的加锁和解锁方式和我们前面说的NSLock是一样的,就是lock和unlock方法,你要是简单的使用它来解决线程同步的问题...使用递归锁可以在一个线程中反复获取锁而不造成死锁,在这个过程中也会记录获取锁和释放锁的次数,只有等两者平衡的时候才会释放,下面是我们Demo中的示例: // 递归调用 func...但我们是在Swift中来讨论线程锁的,这里也就不能再使用 @synchronized,因为在Swift中它是不在使用了的,相应代替它的是下面下面这两句:objc_sync_enter() 中间是你需要加锁的代码...大概的了解一下,具体的问题可以去这里仔细看看:不再安全的 OSSpinLock 2、dispatch_barrier_async/dispatch_barrier_sync 这个我在前面总结
但你有没有想过为什么必须使用这个笨拙的 API,而不是只传递一个 TableViewCell的数组?让我们来看看为什么。 假设你有一个有一千行的表视图。...由于本节仅涵盖了状态保存和恢复的基础知识,因此我推荐 Apple Inc. 上的以下文章。...应当尽量避免在主线程上执行复杂的计算,网络和繁重的IO操作(例如,磁盘的读取和写入)。 你可能曾经使用过突然对你的操作停止响应的应用程序,就好像应用程序已挂起。...较高的 QoS 值也会因使用更多资源而消耗更多能量。 以下是从最高优先级到最低优先级的 QoS 值列表: ?...需要记住,所有 UIKit 代码始终都应该在主线程上执行。
PHPicker iOS 14 中系统新增了一个图片选择器 PHPicker,官方建议使用 PHPicker 来替代原有的 API 进行图片选择,下面我们来看看 PHPicker 的优点: 支持多选 支持搜索...,展示时需要切换到主线程 if let image = data as?...,因为之前我也不知道怎么获取,那么下面让我们一起来看下怎么获取视频。...,那么有可能是设备没有连接到 iCloud,只能加载本地资源,而无法加载 iCould 上的资源。...注意: 这组 API 并不是新出的,从 iOS 8 开始就支持了。
所以作为 iOS 开发者的我们,在日常的开发中,也早已不是处理显示零星的数据这么简单,为了流量往往我们需要在 App 里显示大量有价值的信息来吸引用户,如何优雅的显示这些海量的数据,考量的就是你的个人经验了...为了改善应用程序体验,在 iOS 10 上,Apple 对 UICollectionView 和 UITableView 引入了 Prefetching API,它提供了一种在需要显示数据之前预先准备数据的机制...其实这个无限滚动并不是真正意义上的永无止尽,严格意义上来讲它是有尽头的,只不过这个功能背后的数据是不可估量的,只有大量的数据做支持才能让应用一直不断的从服务端获取数据。...如何避免滚动时的卡顿 当你遇到滚动卡顿的应用程序时,通常是由于任务长时间运行阻碍了 UI 在主线程上的更新,想让主线程有空来响应这类更新事件,第一步就是要将消耗时间的任务交给子线程去执行,避免在获取数据时阻塞主线程...苹果提供了很多为应用程序实现并发的方式,例如 GCD,我在这里对 Cell 上的图片进行异步加载使用的就是它。
有并发的地方就存在线程安全问题,尤其是对于 Swift 这种还没有内置并发支持的语言来说线程安全问题更为突出。下面我们通过常见的数组操作来分析其中存在的线程问题,以及如何实现一个线程安全数组。...读操作 } 由于写操作并不需要返回操作结果,所有这里可以使用异步的方式进行。...这与我们在学习操作系统是的 读者-作者 问题本质上是一类问题,我们可以通过共享互斥锁来解决写操作的数据竞争问题。对于 iOS 来说它就是 GCD 中的写栏栅 barrier 机制。...通过 filePrivate 属性 array 和 queue , SafeArray 成功的实现了大多数数组常用功能,更为关键的是该类型并发安全:所有的写操作都通过 barrier 方式的异步进行,而读操作则与内置...虽然由于使用了 GCD 机制导致速度慢了 30% 左右并且使用了更多的内存,但是与之对应的是我们实现了一个并发安全的数组类型。 原文地址
PHPicker iOS 14 中系统新增了一个图片选择器 PHPicker,官方建议使用 PHPicker 来替代原有的 API 进行图片选择,下面我们来看看 PHPicker 的优点: 支持多选 支持搜索...,因为之前我也不知道怎么获取,那么下面让我们一起来看下怎么获取视频。...,那么有可能是设备没有连接到 iCloud,只能加载本地资源,而无法加载 iCould 上的资源。...注意: 这组 API 并不是新出的,从 iOS 8 开始就支持了。...如果没有自定义 Picker 的朋友可以考虑使用我们做的第三方图片选择框架 AnyImageKit。 以上就是 iOS 14 相册的改动以及 PHPicker 的全部内容,如有错误欢迎指出。
领取专属 10元无门槛券
手把手带您无忧上云