相关疑难解决方法(0)

是什么决定了 Swift 5.5 任务初始值设定项是否在主线程上运行?

这是我之前的asyncDetached 在 MainActor call 之后回到主线程的后续。

这是 iOS 视图控制器的完整代码:

import UIKit

func test1() {
    print("test1", Thread.isMainThread) // true
    Task {
        print("test1 task", Thread.isMainThread) // false
    }
}
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        test1()
        test2()
    }

    func test2() {
        print("test2", Thread.isMainThread) // true
        Task {
            print("test2 task", Thread.isMainThread) // true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个函数test1test2是相同的,并且是从同一位置调用的。然而,其中一个operation:在后台线程上运行其任务初始值设定项函数,另一个在主线程上运行。

是什么决定了这一点?我只能认为这与声明方法的位置有关。但这与声明方法的位置有什么关系呢?

async-await swift swift5

24
推荐指数
2
解决办法
8599
查看次数

我可以在 Swift 中使用 actor 始终在主线程上调用函数吗?

我最近看到 Swift 在Swift 5.5 中引入了对 Actor 模型的并发支持。当我们有一个共享的、可变的状态时,这个模型支持安全的并发代码以避免数据竞争。

我想避免应用程序 UI 中的主线程数据竞争。为此,我将DispatchQueue.main.async在调用站点中设置UIImageView.image属性或UIButton样式的任何地方进行包装。

// Original function
func setImage(thumbnailName: String) {
    myImageView.image = UIImage(named: thumbnailName)
}

// Call site
DispatchQueue.main.async {
    myVC.setImage(thumbnailName: "thumbnail")
}
Run Code Online (Sandbox Code Playgroud)

这似乎不安全,因为我必须记住在主队列上手动调度该方法。另一种解决方案如下所示:

func setImage(thumbnailName: UIImage) {
   DispatchQueue.main.async {
      myImageView.image = UIImage(named: thumbnailName)
   }
}
Run Code Online (Sandbox Code Playgroud)

但这看起来像很多样板文件,我不会说我喜欢将它用于具有不止一层嵌套的复杂功能。

Swift 对 Actors 的支持看起来像是一个完美的解决方案。那么,有没有办法让我的代码更安全,即始终使用 Actors 在主线程上调用 UI 函数?

multithreading ios swift swift5.5

2
推荐指数
1
解决办法
569
查看次数

标签 统计

swift ×2

async-await ×1

ios ×1

multithreading ×1

swift5 ×1

swift5.5 ×1