当前位置:   article > 正文

[SwiftUI 开发] Actor 陷阱

[SwiftUI 开发] Actor 陷阱

 什么是Actor? 

        在 Swift 中,actor 通过按顺序一次处理一个任务来避免数据竞争。这意味着,尽管你可能已经在多个不同的地方同时调度了对 actor 的访问,但这些访问不会同时占用 actor 的状态。这一点类似于串行队列在 GCD(Grand Central Dispatch)中的处理方式,但 actor 提供了更强大和直观的功能。

Actor在reentrancy需要注意的问题 

我们先看一个dome

  1. actor Counter {
  2. var balance = 1000
  3. func withdraw(_ amount: Int) async {
  4. guard amount <= balance else {
  5. return
  6. }
  7. // 等待一秒
  8. let oneSecond = UInt64(1e9)
  9. await Task.sleep(oneSecond)
  10. balance -= amount
  11. }
  12. }
  13. let counter = Counter()
  14. Task{
  15. await counter.withdraw(800)
  16. await print(counter.balance)
  17. }
  18. Task{
  19. await counter.withdraw(600)
  20. await print(counter.balance)
  21. }
  22. // 输出结果
  23. // -400
  24. // -400

我们创建了一个Actor,有个balance参数,记录对象还有多少钱。
调用俩异步去扣钱,首先判断余额是否够,然后执行一个await, 最后再扣钱
Actor遇到await就会reentrancy,让其它的异步来执行
这时候两个异步都还没有扣款,导致把balance扣成负数

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/300952
推荐阅读
相关标签
  

闽ICP备14008679号