UIActivityIndicator 不使用 GCD 旋转
UIActivityIndicator Not Spinning With GCD
我正在制作一个非常简单的应用程序来使用 GCD 练习多线程。我在 ViewController class 中初始化了一个 UIActivityIndicatorView,如下所示:
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()
}
}
}
-祝你好运。
我正在制作一个非常简单的应用程序来使用 GCD 练习多线程。我在 ViewController class 中初始化了一个 UIActivityIndicatorView,如下所示:
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()
}
}
}
-祝你好运。