Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active March 13, 2017 15:28
Show Gist options
  • Save KentarouKanno/50a863b8c88d4486b1eda98041637f43 to your computer and use it in GitHub Desktop.
Save KentarouKanno/50a863b8c88d4486b1eda98041637f43 to your computer and use it in GitHub Desktop.
Dispatch

Dispatch (Grand Central Dispatch)

// 3秒後に実行される
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(3 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {

    // メインスレッドで遅延実行される
    print(NSThread.isMainThread()) // true
}

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(3 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {

    // サブスレッドで遅延実行
    print(NSThread.isMainThread()) // false
}

★ NSTimerによる遅延実行

NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector:#selector(ViewController.delaySelector), userInfo: nil, repeats: false );

func delaySelector() {

    // メインスレッドで実行される
    print(NSThread.isMainThread()) // true
}

★ GCD extension

// メインスレッドで即時実行
func dispatch_async_main(block: () -> ()) {
    dispatch_async(dispatch_get_main_queue(), block)
}

// サブスレッドで即時実行
func dispatch_async_global(block: () -> ()) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)
}

// メインスレッドで遅延実行
func dispatch_async_main_after(minute: Double, block: () -> ()) {
    let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(minute * Double(NSEC_PER_SEC)))
    dispatch_after(delayTime, dispatch_get_main_queue(), block)
}

// サブスレッドで遅延実行
func dispatch_async_global_after(minute: Double, block: () -> ()) {
    let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(minute * Double(NSEC_PER_SEC)))
    dispatch_after(delayTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)
}

dispatch_async_global {
    // サブスレッド実行
    
}

dispatch_async_main {
    // メインスレッド実行
    
}

dispatch_async_global {
    // サブスレッド実行
    
    dispatch_async_main {
        // メインスレッド実行
        
    }
}

// 6秒後にメインスレッドで実行
dispatch_async_main_after(6) {
    print(NSThread.isMainThread()) // true
}

// 5秒後にサブスレッドで実行
dispatch_async_global_after(5) {
    print(NSThread.isMainThread()) // false
}

★ 省略しない例

// メインスレッドで実行

dispatch_async(dispatch_get_main_queue(), {
    // Main Threadで実行する
    print(NSThread.isMainThread())
})
// サブスレッドで実行

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
    // Sub Threadで実行する
    print(NSThread.isMainThread())
})
// メインスレッドで遅延実行

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
    println("test")
}

★ Swift3 メインスレッドで遅延実行

SVProgressHUD.show()
        
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    // your function here
    SVProgressHUD.dismiss()
    
    // 2秒後に呼ばれる
}

Sample

Grand Central Dispatch (GCD) and Dispatch Queues in Swift 3

let queue = DispatchQueue(label: "com.qppcoda.myqueue")

queue.sync {
    for i in 0 ..<  10 {
        print("🔴", i)
    }
}

/*
 🔴 0
 🔴 1
 🔴 2
 🔴 3
 🔴 4
 🔴 5
 🔴 6
 🔴 7
 🔴 8
 🔴 9
*/

sync

let queue = DispatchQueue(label: "com.qppcoda.myqueue")

func simpleQueues() {
    queue.sync {
        for i in 0 ..<  10 {
            print("🔴", i)
        }
    }
    
    for i in 100 ..<  110 {
        print("Ⓜ️", i)
    }
}

simpleQueues()

/*
 🔴 0
 🔴 1
 🔴 2
 🔴 3
 🔴 4
 🔴 5
 🔴 6
 🔴 7
 🔴 8
 🔴 9
 Ⓜ️ 100
 Ⓜ️ 101
 Ⓜ️ 102
 Ⓜ️ 103
 Ⓜ️ 104
 Ⓜ️ 105
 Ⓜ️ 106
 Ⓜ️ 107
 Ⓜ️ 108
 Ⓜ️ 109
*/

async

let queue = DispatchQueue(label: "com.qppcoda.myqueue")

func simpleQueues() {
    queue.async {
        for i in 0 ..<  10 {
            print("🔴", i)
        }
    }
    
    for i in 100 ..<  110 {
        print("Ⓜ️", i)
    }
}

simpleQueues()


/*
 Ⓜ️ 100
 🔴 0
 🔴 1
 Ⓜ️ 101
 🔴 2
 Ⓜ️ 102
 Ⓜ️ 103
 Ⓜ️ 104
 Ⓜ️ 105
 Ⓜ️ 106
 🔴 3
 🔴 4
 🔴 5
 🔴 6
 Ⓜ️ 107
 🔴 7
 Ⓜ️ 108
 🔴 8
 🔴 9
 Ⓜ️ 109
*/

DispatchQoS

let queue1 = DispatchQueue(label: "com.appcoda.queue1", qos: DispatchQoS.userInitiated)
let queue2 = DispatchQueue(label: "com.appcoda.queue2", qos: DispatchQoS.userInitiated)

func queuesWithQos() {
    queue1.async {
        for i in 0 ..<  10 {
            print("🔴", i)
        }
    }
    
    queue2.async {
        for i in 100 ..<  110 {
            print("🔵", i)
        }
    }
}

queuesWithQos()


/*
 🔴 0
 🔵 100
 🔴 1
 🔵 101
 🔴 2
 🔵 102
 🔴 3
 🔵 103
 🔴 4
 🔵 104
 🔴 5
 🔵 105
 🔴 6
 🔵 106
 🔴 7
 🔵 107
 🔴 8
 🔵 108
 🔴 9
 🔵 109
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment