Xcode 16.3 正式版本发布了,Swift 6 也更新到了 6.1 版本,终于完全把项目迁移到 Swift 6 了。
Swift 6 的迁移过程网络上的文章已经很多了,和我遇到的问题基本上大同小异,参考一下就可以顺利解决。
顺利编译运行起来后,在某些情况下会发生崩溃:
Thread 6 Queue: com... (concurrent)
O _dispatch_assert_queue_fail
1 dispatch_assert_queue$V2.cold.1
2 dispatch_assert_queue
3 swift_task_isCurrentExecutorWith...
4 closure #1 in CreateCommentView...
5 ReactiveSwift.Operators.Filter.rece...
6 ReactiveSwift.Observer.process(R...
7 ReactiveSwift.Signal.Observer.sen...
8 generic partial specialization < Sign...
9 ReactiveSwift.Signal.Observer.sen...
10 merged closure #1 (Swift.Optional...
11 partial apply forwarder for closure...
12 closure #3 (Swift.Optional<Swift....
13 function signature specialization...
14 @objc ReactiveCocoa. KeyValueO...
15 NSKeyValueNotifyObserver
16 NSKeyValueDidChange
17 - [NSObject(NSKeyValueObservin...
18 - [NSObject(NSKeyValueObservin...
19 _NSSetObjectValueAndNotify
20 closure #1 in closure #1 in Cre...
查看代码逻辑发现都是和 GCD 相关,在 GCD 的 block 里混合使用了 Task {...}
或者是 actor
相关的方法,触发了 GCD 的 actor
的隔离断言。
这类情况在编译期间无法察觉(没有编译警告),如果在生产环境肯定会影响用户体验,解决方法是在 Release 的配置里添加 -disable-dynamic-actor-isolation
编译选项:
OTHER_SWIFT_FLAGS = -disable-dynamic-actor-isolation