2016-05-12 40 views
0

我正在製作一個非常簡單的應用程序來使用GCD來練習多線程。我在我的ViewController類初始化的UIActivityIndi​​catorView像這樣:UIActivityIndi​​cator不與GCD一起轉動

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.myActivityIndi​​cator.startAnimating()是沒有得到所謂的,但是當我把該行的代碼在viewDidLoad中,它工作得很好。

我錯過了什麼?

+1

只需從主隊列中調用myActivityIndi​​cator.startAnimating() –

+1

@LeoDabus哇!我不敢相信我忽略了......謝謝! – doc92606

回答

0

這是解決通過啓動主線程的動畫:

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

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

但是當在viewDidLoad()中加載視圖控制器時,它只發生在主線程中,它可以立即更新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() 
     } 
    } 
} 

- 好運氣。

相關問題