首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Swift 周报 第二十期

根据这些用户说法,苹果支持部门已经通知他们,该问题不是硬件缺陷造成,而是 iOS 16 错误 Bug。...[5] 议案 [Pitch] 结果构建器范围内不合格查找[6] 介绍: 结果构建器为定义声明式 DSL 提供了基础——特定领域语言提供了在特定领域工作定制语法,例如生成图表或文本处理。...这常常让我想起嵌套 if 语句,作为一个“从不嵌套”的人,我通常会在这里求助于 guard 关键字。...return } 正如评论所暗示那样,我没有引用 guard 语句 else 部分中错误类型。据我所知,没有办法使用这种语法并访问返回错误类型。...://forums.swift.org/t/se-0368-staticbigint/59421 [9] ArgumentParser 包出现 no such file 错误: https://forums.swift.org

1.3K40

Swift 周报 第九期

提交和拉取请求 Alejandro Alonso合并了一个删除 ICU拉取请求[7]。 同意提案 SE-0331 从不安全指针类型中删除Sendable已被接受[8]。...多年来,这已经通过引起混乱上升到主动危害程度,导致程序员走上错误道路,一旦他们遇到值级抽象[11]基本限制[12],通常需要他们重新编写代码。该提案通过使用 any 明确存在类型巨大影响。...作为交换,Swift 会自动拒绝可能不安全存储属性访问。这是问题描述和建议解决方案 3。 Actor 析构器不能再访问实例不可发送存储属性。...一个陷阱是pthread_mutex_t从与持有锁线程不同线程解锁未定义行为。跨暂停点读取和写入线程本地存储也可能导致意外行为,因为操作可能会在不同线程上恢复。...作为交换,Swift 会自动拒绝对可能不安全存储属性访问。这是问题描述 2和建议解决方案 1。 Actor 析构器不能再访问实例不可发送存储属性。

85320
您找到你想要的搜索结果了吗?
是的
没有找到

Asyncawait

实际上,异步函数从不自主地放弃所在线程,他们只在异步函数到一个挂起点(suspension point)时才会放弃线程。...这并不意味着它将在与之前完全相同线程上运行,因为 swift 语言不保证在挂起之后运行。这种设计中,线程几乎更像是一种实现机制,而不是并发接口一部分。...因此,直接使用线程来做状态隔离库(例如, 通过创建自己线程并在其上按顺序调度任务),通常应该将这些线程模型构建为 Swift actors, 以便于这些基本语言保证正常运行。...在潜在挂起点上对await要求遵循了 Swift 先例,即要求try表达式覆盖对可能抛出错误函数调用。...在上面两种场景中,在这些计算运行时,线程都不可能插入代码,通常情况下没有代码干扰是正确,但是这也可能变成一个扩展性问题。一个需要进行大量计算异步程序通常应该放到独立上下文运行。

1.9K40

Swift基础 内存安全

例如,Swift确保变量在使用前初始化,在释放后无法访问内存,并检查数组索引是否有越界错误Swift 还要求修改内存位置代码独占该内存访问权限,从而确保对同一内存区域多次访问不会发生冲突。...此示例还展示了您在修复内存访问冲突时可能会遇到挑战:有时有多种方法可以解决产生不同答案冲突,并且并不总是很明显哪个答案是正确。...注意 如果您编写了并发或多线程代码,对内存访问冲突可能是一个熟悉问题。然而,这里讨论相互冲突访问可能发生在单个线程上,不涉及并发或多线程代码。...如果您从单个线程中对内存访问存在冲突,Swift保证您在编译时或运行时都会收到错误。对于多线程代码,请使用线程消毒器来帮助检测跨线程冲突访问。...以下代码显示,对存储在全局变量中结构属性重叠写入访问也会出现相同错误

7100

Swift | 内存安全

简介 一般来说,Swift 会阻止代码中不安全行为。例如,Swift 会保证变量在被使用前已经初始化,在释放某变量后其内存也会变得不可访问,以及检查数组索引是否存在越界错误。...然而,了解什么地方会有潜在内存冲突发生也是很重要,这样你就可以避免写出对内存访问有冲突代码。如果你代码中确实包含冲突,则会出现编译时错误或运行时错误。...这个例子同样也展示了在解决冲突访问时你可能会遇到问题:不一样解决冲突方式会带来不一样答案,要知道哪个答案是正确通常来说没有那么显而易见。...注意: 如果你是在编写有关并发或多线程代码,那么内存访问冲突可能是一个常见问题。但要注意是,我们在这讨论冲突访问是可能发生在单线程上,并且不涉及并发或多线程代码。...如果你在单线程中对内存访问存在冲突,Swift 会确保在编译时或运行时报错。对于多线程代码,请使用 Thread Sanitizer 来检测多线程冲突访问。 3.

64820

Swift基础 并发性

Swift允许您以允许一些编译时检查方式表达您意图——例如,您可以使用参与者安全地访问可变状态。然而,向缓慢或错误代码添加并发并不能保证它会变得快速或正确。...本章其余部分使用并发一词来指代异步和并行代码常见组合。 注意 如果您以前编写过并发代码,您可能习惯于处理线程Swift并发模型构建在线程之上,但您不会直接与它们交互。...Swift异步函数可以放弃它正在运行线程,这允许另一个异步函数在第一个函数被阻止时在该线程上运行。 虽然可以在不使用Swift语言支持情况下编写并发代码,但该代码往往更难阅读。...标记为await代码中可能暂停点表示,当前代码可能会在等待异步函数或方法返回时暂停执行。这也被称为生成线程,因为在幕后,Swift暂停在当前线程上执行代码,而是在该线程上运行一些其他代码。...由于任务和任务组之间显式关系,这种方法被称为结构化并发。虽然您承担了一些正确责任,但任务之间明确父子关系允许Swift为您处理一些行为,例如传播取消,并允许Swift在编译时检测到一些错误

12200

Swift 发布路线图:更便捷、更高效且更安全

它在什么线程上?不清楚。这是潜在数据争用:这个回调可能需要在执行分配之前分派回正确队列。也许这是由 allPlayers 处理,但是我们无法在本地推理这段代码是否是线程安全。...通常,当 self 为 nil 时,此类函数会立即返回,由于可能跳过了任意数量代码,因此更难推理其正确性。 因此,这里展示模式是很好,但是在 Swift 中表达它们会丢失重要结构并产生问题。...相反,我们必须相信程序员可以正确使用它们。 原则上,任何地方任何代码都可以访问全局内存(例如全局变量或静态变量),因此会受到数据争用影响。 也可以从保存有对该类引用任何代码中访问类组件内存。...预期将在第二阶段讨论特性包括: 引入类型上 actorlocal 限制; 编译器支持通过 mutableIfUnique 类类型,保证正确“写时复制”类型; 在通过其他某种方式处理线程安全之类情况下...线程 是指底层平台线程概念。平台各不相同,但是基本特征大致是一样:真正并发需要创建一个平台线程,但是创建和运行平台线程开销很大。C 函数调用和普通同步 Swift 函数都需要使用平台线程

76720

了解 Swift 调度器

前言 iOS 应用开发中最常见错误之一是线程错误,当开发者试图从一个闭包中更新用户界面时,会出现这种错误。...之前对 Swift、Combine 框架和 iOS 开发知识是必要。 让我们开始吧! 什么是调度器? 根据调度器文档[1],调度器是 "一个定义何时何地执行一个闭包协议"。...上面的代码块是在主线程上运行。 RunLoop RunLoop 调度器用于在一个特定运行循环上执行任务。在运行循环上行动可能是不安全,因为 RunLoops 不是线程安全。...7, name = null} Received e on thread {number = 7, name = null} 在上面的代码块中,这些值是从不线程而不是主线程发出...我们还谈到了 Combine 框架以及它是如何影响 Swift 中调度器使用。 我们学习了如何在 Swift 中使用 receive(on) 和 subscribe(on) 方法来切换调度器。

2.5K10

·FMDB:第三方本地数据库处理框架(官方文档翻译篇)

FMResultSet:表示FMDatabase执行查询后结果集 FMDatabaseQueue:如果你想在多线程中执行多个查询或更新,你应该使用该类。这是线程安全。...简单来说,只要不是以SELECT开头命令都是UPDATE命令。 执行更新返回一个BOOL值。YES表示执行成功,否则表示有那些错误 。...在Swift中,您将使用它executeUpdate(values:),这不仅仅是一个简洁Swift语法,而且也是throws错误处理正确错误: do { let identifier =...一个线程一个FMDatabase对象一直是可以。只是不要跨线程共享单个实例,绝对不要同时跨多个线程。否则,意外会经常发生,程序会时不时崩溃,或者报告异常。总之很崩溃。...该FMDatabaseQueue对象将同步并协调跨多个线程访问。以下是如何使用它: 首先,让你队列。

1.2K20

Swift 周报 第三十八期

正在审查提案 SE-0409[3] 在导入声明上使用访问级别修饰符 提案正在审查。 通过在导入声明上使用访问级别修饰符来声明依赖项可见性,可以强制规定哪些声明可以引用导入模块。...这不是什么新鲜事,Swift 已经完全能够表达这种类型,因此我不断听到“由于编译器复杂性而经常被拒绝提案”显然也是非常错误。...在 Swift 中使用 BSD 套接字感觉就像我在与该语言作斗争:很多都陷入了 UnsafePointer 领域。...我不确定这是否是“正确处理方式,但它足以让它在我正在构建应用程序中顺利运行。 你可能会考虑由 IBM 开发并在 macOS、iOS 和 Linux 上运行 BlueSocket。...中使用 actors 实现线程安全[14] 摘要: 本文介绍了在 Swift 中使用 actors 实现线程安全方法。

20930

Swift 周报 第四十二期

提案 正在审查提案 SE-0413[2] Typed throws 提案正在审查。 Swift 错误处理模型允许标记为 throws 函数和闭包指示它们可以通过引发错误来退出。...讨论MainActor 上上下文切换和线程数[6] 提问 我正在观看 Swift 并发:幕后[7]我了解到,作为使用 Swift 并发开发人员,我们不应该违反不阻塞线程运行时契约。...推荐博文 基于 UI 交互意图理解异常检测方法[9] 摘要: 本文介绍了利用页面多模态信息在UI测试领域探索与实践经验。...Actors 可以确保代码在特定线程上执行,如主线程或后台线程,并帮助同步访问可变状态以防止数据竞争。...如果您调用代码访问带有 actor 属性方法,您必须使用任务(task)或采用相同全局 actor 。文章提供了相关示例代码,并说明了编译器如何防止在非异步上下文中调度到 actor 线程

20410

SwiftData 中并发编程

读者需要具备一定 Swift 并发编程经验。 访问博客 www.fatbobman.com[1] 可以获得更好阅读体验以及最新更新内容。...这样可以确保 Actor 方法和任务以串行方式执行,即同一时间只能有一个任务在执行。这保证了 Actor 内部状态和数据在任何时候都是线程安全,避免了并发访问问题。...如果对象既不在上下文中,也不在持久化存储中,该方法会抛出一个错误。简单来说,除非该数据在持久化存储上并不存在,否则必然会返回一个非惰值状态对象。...换句话说,即使我们在错误线程(队列)对属性进行修改,这些方法会自动将操作切换到正确队列中进行。通过进一步尝试,我们发现这种调度能力至少存在于 BackingData 协议实现层面。...这是我们今后要研究课题。 欢迎访问 fatbobman.substack.com[8] 订阅 Fatbobman's Swift Weekly 中英文电子邮件版本。

31530

Swift MainActor 使用和主线程调度

MainActor 是Swift 5.5中引入一个新属性,它是一个全局 actor,提供一个在主线程上执行任务执行器。...编译器执行MainActor属性要求,可使用如下代码修复错误: final class HomeViewModel { @MainActor var images: [UIImage] = [...在 Swift 5.5 之前,你可能定义了很多调度语句,以确保任务在主线程上运行。...在这里使用@MainActor属性可以让Swift编译器对我们代码进行性能优化。 选择正确策略 使用 actors 时选择正确策略很重要。...在某些情况下,如果数据请求方法也是从一个不需要在主线程上处理完成回调地方使用,这可能就没有意义了。 在这些情况下,让实现者负责调度到正确队列可能会更好。

2.7K10

Vision Pro 有望 2 月上市| Swift 周报 issue 44

上期话题结果 根据投票结果显示了程序猿对于职业领域中性别平等关注,强调了专业能力和领导风格重要性。...这使得开发人员可以对 actor 的确切线程语义获得一定控制,例如,通过确保特定 actor 执行所有工作都在专用队列或线程上完成。...然而,目前一般任务和非隔离异步函数没有同样灵活性,非隔离异步函数总是在由 Swift Concurrency 管理默认全局并发线程池上执行。...虽然这一成就令人兴奋,但也强调了一些需要改进领域: 从 CMake 过渡到 Swift Package Manager (SwiftPM),以便更轻松地进行构建管理和其他 Swift集成。...社区响应普遍表示支持将此功能合并到异步算法包中,因为它对于确保正确异步数据流具有重要意义。 人们一致认为,此类功能至关重要,但正确实施具有挑战性,因此拥有 Apple 支持中心实施地点是有益

6100

SQLite 并发四种处理方式

通过这种设计,任意时刻都只会存在一个线程对数据库拥有访问权限。也就是说上诉第一个并发问题被完美解决了。 然而改方案却无法应对第二个问题。...FMDB 方案 FMDB 与 SQLite.swift 一样都是采用串行设计,只不过 FMDB 在此基础上做了些加强:FMDB 中使用者不会接触到数据库连接而是通过在 API 闭包中组织语句来实现数据库访问...,进一步提高了多线程访问安全。...但是这种设计也存在缺点,首先扩大后上下文管理是一件非常麻烦事,另外所有的写操作都会被严格束缚而且冲突处理依然很棘手,最后严格上下文管理也让 Core Data 中编写正确线程代码也变得很困难。...总结 每一类库作者都对 SQLite 并发处理有着自己思考,所以没有这里并不存在一种标准处理方式。如果封装过于简单的话,那么对使用者要求就会比较高否则就会出现很多意想不到错误或崩溃。

6.6K70

深度分析:前端中后端-实现篇

Swift 代码只需要提供对应句柄访问 FFI 接口,就可以调用 Rust 侧代码进行工作。...同步请求会阻塞 Swift 代码所在线程;而异步请求则在不同线程执行,完成之后调用 Swift 侧提供 callback,提交结果。...错误处理 跨语言错误处理是一个很有意思技术活。我们需要回答一个核心问题:如何把 Rust 代码错误 Resut,优雅地转化成 Swift Exception?...Rust FFI 接口之外单元测试自不必说,该怎么搞就怎么搞,我们用单元测试(以及 property testing)保证纯粹 Rust 代码在逻辑上正确性。...这里,我们让 panic 发生后,做完正常处理流程,就立刻结束整个进程。这样,在 tokio 运行时某个线程中调用 assert_eq! 被触发并产生错误时,测试能够正常退出并显示测试错误。 ?

1.8K10

结构化并发

这点尤为正确,因为程序员通常想把超时当作关联周期(比如 20ms),但是,库在内部传递正确组合表示一个绝对最后期限(比如 now + 20ms)。...同步函数没有必要作为任务一部分运行。 Swift 认为存在一个底层线程系统。系统调度任务运行在这些线程系统上。...任务不需要从底层线程系统获取特殊调度支持,尽管一个好调度者可以利用 Swift 任务调度一些有趣特性。...执行器(Executors) 执行器是一种服务,它接受作业提交,并安排线程来运行这些作业。系统认为执行器可靠且执行任务从不失败。 正在运行异步函数始终知道它所在执行器。...从其他任务/线程调用该 API 将会造成未定义行为。 访问该 API 将执行特定线程局部变量线程局部查找,该变量由 Swift 并发运行时维护。

2.9K40

探讨 SwiftUI 中几个关键属性包装器

欢迎大家在 Discord 频道[2] 中进行更多地交流 欢迎访问 fatbobman.substack.com[3] 订阅 Fatbobman's Swift Weekly 中英文电子邮件版本。...@State 是线程安全,可以在非主线程中进行修改。...引入 @StateObject 意味着所有相关操作都在主线程上进行( SwiftUI 会隐式为视图添加 @MainActor),包括异步操作。应将需要在非主线程上运行代码应该从视图代码中剥离。...通常情况下,会有多个视图从不同层级观察并响应同一个实例,必须合理优化才能避免应用性能劣化。这也是很多开发者不喜欢 @EnviromentObject 原因。...选择正确工具对于构建高效、可维护 SwiftUI 应用是至关重要。正如在软件开发中经常提到,没有一种工具是万能,但恰当地使用它们可以大大提高我们开发效率和应用质量。

18110

iOS工程师必看 20 道 面试题

请说明并比较以下关键词:atomatic, nonatomic atomic修饰对象会保证setter和getter完整性,任何线程对其访问都可以得到一个完整初始化后对象。...nonatomic修饰对象不保证setter和getter完整性,所以多个线程对它进行访问,它可能会返回未初始化对象。正因为如此,它比atomic快,但也是线程不安全。 4. 什么是ARC?...无须担心内存memory leak或者多线程冲突问题 9. Swift 是面向对象还是函数式编程语言? Swift 既是面向对象,又是函数式编程语言。...其修饰类和方法可以在任意 Module 中被访问和重写;它是 Swift 3 中新添加访问权限。 Public 权限仅次于 Open。...通过Swiftlet设置,使得这些数据达到了真正意义上“不变”,它也从根本上解决了多线程中内存访问和操作顺序问题。 设计成值类型还可以提升API灵活度。

3.6K40
领券