wm.p1us
wm.p1us

Reputation: 2059

global_queue with qos_class_user_interactive

I try to understand GCD and wrote this code to find out run priority:

  override func viewDidLoad() {
    super.viewDidLoad()

    fetchImage()
    print(1)

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
      print(2)
    }

    dispatch_async(dispatch_get_main_queue()) {
      print(3)
    }
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) { 
      print(5)
    }
  }

I got next result in the console:

1

2

5

3

So the question is:

Part 1: Why 3 is after 5 (main_queue has highest priority?)

Part 2: And why 2 is higher that 3 and 5 as well?

Thank you guys!

Upvotes: 3

Views: 6324

Answers (2)

Karsten
Karsten

Reputation: 1907

The result is the order of the priorities. QOS_CLASS_USER_INTERACTIVE means user forground process, so highest priority. QOS_CLASS_USER_INITIATED means user is waiting for the result of the job, so very high priority. And the main queue is normal work load as when user has seen everything and its job.

Upvotes: 0

Wain
Wain

Reputation: 119031

Bear in mind: this is multi-threading, on a multi-core device, writing output to a log that you don't know the thread safety and internal management of...

That said:

  1. 1 is first because it's synchronous
  2. 2 is second because it's also synchronous
  3. 3 is not next because it's pushed into the queue of things waiting to run on the main thread run loop and you don't know what else is already in that queue
  4. 5 is before 3 because it's (basically) the same priority but it's running on a queue that probably does't have anything else waiting (QOS_CLASS_USER_INTERACTIVE ~= main thread priority)

Note, I say ~= because I haven't checked the exact values and it may differ slightly though I expect the priority values to match, otherwise 'interactive' wouldn't mean much...

Upvotes: 4

Related Questions