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:

  • How to remove extra empty cells in TableViewController, iOS - Swift
  • Swift - Unable to read/write from file
  • Is the order of SKNode.nodesAtPoint guaranteed?
  • Converting Character and CodePoint in Swift
  • Using Swift to unescape unicode characters, ie \u1234
  • How to add Objective-C Bridging Header entry?
  • 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!

    Solutions Collect From Internet About “global_queue with qos_class_user_interactive”

    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…