// 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秒後に呼ばれる
}
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
*/
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
*/
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
*/
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
*/