Activity Indicator not appearing

Joon. P picture Joon. P · Jul 7, 2015 · Viewed 10.8k times · Source

I have some heavy code that runs for around 0.2 seconds.

I set up the activity indicator like this; however, it doesn't show up, but rather the whole screen freezes for around 0.2seconds until the code finishes.

func heavyWork() {
    self.actvityIndicator.startAnimating()

    ...
    // heavy loop codes here
    ...

    self.activityIndicator.stopAnimating()
}

Is this the correct way of using the activity indicator?

When I comment out

// self.activityIndicator.stopAnimating()

the activity indicator shows up and stays there - the codes are set up right.

But UI doesn't seem to be updated at the right time.

As i said, the screen just freezes without showing the activity indicator until the heavy code is done.

Answer

holex picture holex · Jul 7, 2015

maybe you want to carry on with such pattern instead:

func heavyWork() {
    self.actvityIndicator.startAnimating()

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in

        // ...
        // heavy loop codes here
        // ...

        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            self.activityIndicator.stopAnimating()
        })
    });
}

as the heavy work should happen in a background thread and you need to update the UI on a main thread after.


NOTE: obviously it is assumed you call the func heavyWork() on a main thread; if not, you might need to distract the initial UI updates to the main thread as well.