在 Swift 中从特定线程运行代码

7ba*_*all 5 nsthread grand-central-dispatch ios swift

我有一个这样的功能:

func foobar() {
  let targetThread = Thread.current

  DispatchQueue.main.async {
    UIView.animate(withDuration: 0.5, animations: {
      // Code I need to run on the main thread
    }, completion: {
      // Code I want to run on targetThread -- HOW?
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我如何从 执行代码targetThread?谢谢。

i_a*_*orf 5

DispatchQueues 不是线程。您会注意到无法像DispatchQueue获取当前线程那样获取当前线程。如果你只想在不是主线程的地方运行代码,你可以使用:

DispatchQueue.global().async { ... }

如果您真的想针对您的特定线程,您有两种选择。

第一个是您可以使用NSObject's perform(_:on:with:waitUntilDone:)(或相关方法之一)并传递NSThread您获得的 。您的问题中没有足够的上下文来说明这是否适合您或举个例子,但您可以搜索。

第二个是重新编写开始所有这些的代码以使用NSOperationQueue,因此foobar()将在 的操作中运行NSOperationQueue,然后在完成动画时,您将安排另一个NSOperation在同一操作队列上运行。您也可以直接使用调度队列来做到这一点:即创建您自己的调度队列,调度 foobar,然后在动画完成时从 main 调度回您的队列。