UIActivityIndi​​cator 不使用 GCD 旋转

UIActivityIndicator Not Spinning With GCD

我正在制作一个非常简单的应用程序来使用 GCD 练习多线程。我在 ViewController class 中初始化了一个 UIActivityIndi​​catorView,如下所示:

class ViewController: UIViewController {

var myActivityIndicator:UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .Gray)

在我的 viewDidLoad 中,我使用以下代码将它作为子视图添加到我的主视图中:

 override func viewDidLoad()
{
    super.viewDidLoad()

    myActivityIndicator.center = view.center
    view.addSubview(myActivityIndicator)
}

然后,当我的按钮被点击时,我有一个 IBAction,它通过在一段时间后打印一条简单消息来处理事件。这是相关代码:

@IBAction func doSomething(sender: AnyObject)
{
    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
    dispatch_async(dispatch_get_global_queue(priority, 0))
    {
        self.myActivityIndicator.startAnimating()

        sleep(3)

        print("This has been accessed on another thread")

        dispatch_async(dispatch_get_main_queue())
        {
            self.myActivityIndicator.stopAnimating()
        }
    }
}

好像 self.myActivityIndicator.startAnimating() 没有被调用,但是当我把那行代码放在 viewDidLoad 中时,它工作得很好。

我错过了什么?

这已通过在主线程上启动动画解决:

 @IBAction func doSomething(sender: AnyObject)
{
    self.myActivityIndicator.startAnimating()
...

只有主线程可以更新UI。所以你必须把更新 UI 的动作放在主线程中。添加 dispatch_async(dispatch_get_main_queue()) { updateSomeUI(); }

但是在viewDidLoad()中加载view controller时,它只是发生在主线程中,它可以立即更新UI。 When code executed in viewDidLoad() When code executed in buttonClick()

@IBAction func doSomething(sender: AnyObject)
{
    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
    dispatch_async(dispatch_get_global_queue(priority, 0))
    {
        dispatch_async(dispatch_get_main_queue()) 
        {
            self.myActivityIndicator.startAnimating()
        }

        sleep(3)

        print("This has been accessed on another thread")

        dispatch_async(dispatch_get_main_queue())
        {
            self.myActivityIndicator.stopAnimating()
        }
    }
}

-祝你好运。