Deep_Dev
article thumbnail
Published 2023. 1. 27. 01:08
[Swift] Dispatch Queue ๐ŸŽ iOS/Swift

 

๐Ÿ“– Dispatch Queue

Queue : FIFO ๊ตฌ์กฐ 

  • Serial Queue
    • ์ด์ „ ์ž‘์—…์ด ๋๋‚˜๋ฉด ๋‹ค์Œ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ง๋ ฌ ํ˜•ํƒœ

  • Concurrent Queue
    • ์ด์ „ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๋ณ‘๋ ฌ ํ˜•ํƒœ

 

๐Ÿ“–  GCD 

GCD : Multi Process๋ฅผ ์œ„ํ•œ Thread Programming์˜ ๋ฐฉ๋ฒ•

๊ธฐ์กด์— Thread Programming์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋™๊ธฐํ™”๋„ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผํ•˜๊ณ ,

deadlock๋„ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๋“ฑ ์Šค๋ ˆ๋“œํ’€์„ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์ง€๋งŒ,

 

์• ํ”Œ์—์„œ ๋”ฐ๋กœ GCD๋ฅผ ํ†ตํ•ด์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ OS์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ๋ถ„๋ฐฐํ•˜๊ฒŒ ๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ Swift์—์„œ๋Š” Thread ๊ด€๋ จ ์ž‘์—…์€ Grand Central Dispatch API ( GCD )๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค.

์–ด๋Š์ž‘์—…์„ ์–ด๋Š Thread๊ฐ€ ํ•  ๊ฒƒ์ธ์ง€, Multi-Thread๋กœ ํ•  ๊ฒƒ์ธ์ง€, ์ฝ”์–ด๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€, Async๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ GCD ์ด๋‹ค.

 

๐Ÿ“Œ  Dispatch Queue ์ฝ”๋“œ

DispatchQueue.main.async{
	// code..	
}

DispatchQueue.global().async{
	// code..
}

GCD์—์„œ ์ œ๊ณตํ•˜๋Š” Queue๋Š” 3๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค.

  • main(serial)
  • global(concurrent)
  • ์ปค์Šคํ…€

 

๐Ÿ“Œ  main(serial)

๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” Serial Queueํ˜•ํƒœ๋กœ, ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๊ณ  ์žˆ๋Š” UiKit์˜ ๋ชจ๋“  ์š”์†Œ๋“ค์€ Main Queue์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. 

์•ฑ์˜ ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์—์„œ task๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ Serial Queue ํ˜•ํƒœ์ด๋‹ค. ์ด ๋ฉ”์ธ ํ๋Š” ์•ฑ์˜ ์‹คํ–‰๋ฃจํ”„์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ํ์— ์žˆ๋Š” task์˜ ์‹คํ–‰์„ ์‹คํ–‰ ๋ฃจํ”„์— ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ์†Œ์Šค์˜  ์‹คํ–‰๊ณผ ์–ฝํžŒ๋‹ค. 

 

๊ฐ„ํ˜น Dispatch Queue๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€, main.sync๋ฅผ ํ•˜๋ฉด ์•ฑ์ด ์ฃฝ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์™œ ํ•˜๋ฉด ์•ˆ๋˜๋ƒ?

Zedd0202๋‹˜์ด ๋”ฐ๋กœ ์ •๋ฆฌํ•œ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

https://zeddios.tistory.com/519

 

iOS ) ์™œ main.sync๋ฅผ ํ•˜๋ฉด ์•ˆ๋ ๊นŒ

์•ˆ๋…•ํ•˜์„ธ์š” :) Zedd์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์™œ!!! ์™œ main.sync๋ฅผ ํ•˜๋ฉด ์•ˆ๋˜๋Š”์ง€ ์ž์„ธํžˆ ๊ณต๋ถ€ํ•ด๋ณผ๊ฒŒ์š”. ๊ทธ๋ ‡๋‹ค๊ณ  main.sync๋ฅผ ๋ฌด์กฐ๊ฑด ํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š”๊ฒƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์š” ๋ถ€๋ถ„์€ ๋ฐ‘์—์„œ ๋‹ค์‹œ ๋ณผ๊ฒŒ์š”. main.sync๋ฅผ ํ•˜๊ฒŒ

zeddios.tistory.com

 

 

๐Ÿ“Œ  global (concurrent)

์ „์ฒด ์‹œ์Šคํ…œ์—์„œ ๊ณต์œ ๋˜๋Š” concurrent queue์ด๋‹ค. ์œ„์—์„œ concurrent queue๋Š” ๋™์‹œ์— ์ง„ํ–‰๋œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๋ฐ‘์—์„œ ์„ค๋ช…ํ•  Qos๋ฅผ ํ†ตํ•ด์„œ ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. 

 

 

๐ŸŽ Qos
Quality of Service์˜ ์•ฝ์ž๋กœ, Dispatch Queue์—์„œ ์ˆ˜ํ–‰ ํ•  ์ž‘์—…์„ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
ํ•ด๋‹น Qos๋ฅผ ์ง€์ •ํ•ด์ค˜์„œ ์ค‘์š”๋„๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ์‹œ์Šคํ…œ์ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๊ณ  ์ด์—๋”ฐ๋ผ ์Šค์ผ€์ฅด๋ง์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ž‘์—…์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์ž‘์—…๋ณด๋‹ค ๋นจ๋ฆฌ ์ˆ˜ํ–‰๋˜๊ณ , ์ž˜ ์„ค๊ณ„ํ•œ๋‹ค๋ฉด ์กฐ๊ธˆ ๋” ๋ฐ˜์‘์ ์ธ ์•ฑ์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
DispatchQueue.global(qos: .background){
	// code..
}

 

๐Ÿ’ก Qos ์ข…๋ฅ˜

>> Qos์˜ ์šฐ์„  ์ˆœ์œ„

userInteractive

userInitiated

default

utility

background

unspecified

 

์šฐ์„ ์ˆœ์œ„๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‹น์žฅ ๊ธ‰ํ•˜๊ฒŒ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์ด๋ผ๋ฉด UserInteractive๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ,

๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒœ์ฒœํžˆ ์ž‘์—…ํ•ด๋„ ๋œ๋‹ค๋ฉด background๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

๐Ÿ“Œ  ์ปค์Šคํ…€

๊ฐœ๋ฐœ์ž๊ฐ€ ์ž„์˜๋กœ Queue๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๋ณดํ†ต์€ Serial Queue๋ฅผ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ปค์Šคํ…€ํ•ด์„œ main queue์—์„œ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•  ๋‚ด์šฉ๋“ค์„ ๋”ฐ๋กœ ๋นผ์„œ ์ž‘์—… ํ• ๋•Œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์ปค์Šคํ…€ Queue๋Š” Global Queue์—์„œ ์ˆ˜ํ–‰ ๋œ๋‹ค.

 

 

๐Ÿ“– sync / async

sync : ํ์— ์ž‘์—…์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋ฉด, ๊ทธ๊ฒŒ ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ

async : sync์™€ ๋‹ค๋ฅด๊ฒŒ ์ผ๋‹จ ํ์— ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋™์‹œ์— ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

 

๐Ÿ“Œ  sync

๋‹ค์Œ์ฒ˜๋Ÿผ sync๋ฅผ ๊ฑธ์–ด๋‘๊ฒŒ ๋˜๋ฉด 1,2,3,4,5๊ฐ€ ์ฐํžˆ๋Š” ์ž‘์—…์ด ๋๋‚œ ๋’ค์—๋งŒ 100, 101, 102...๊ฐ€ ์ฐํžˆ๊ฒŒ ๋œ๋‹ค.

1~5๋ฅผ sync๋กœ ๊ฑธ์–ด๋†จ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

DispatchQueue.global().synnc{
	for i in 1...5 {
    	print(i)
    }
}

for i in 100...105 {
	print(i)
}

 

๐Ÿ“Œ  async

async๋ฅผ ๊ฑธ์–ด๋‘๊ฒŒ๋˜๋ฉด ๋™์‹œ์— ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๊ณผ 200๊ณผ 100์ด ์„ž์—ฌ๋‚˜์˜จ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์— ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ๋„ ๋งค๋ฒˆ ๋‹ฌ๋ผ์ง„๋‹ค.

DispatchQueue.global().async{
	for i in 1...5 {
    	print(i);
    }
}

DispatchQueue.global().async {
	for i in 200...205 {
    	print(i)
    }
}

for i in 100...105 {
	print(i)
}

 

์ด GCD๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋”ฐ๋กœ ์“ฐ๋ ˆ๋“œ๋“ค์„ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๊ฐ„ํŽธํ•˜๋‹ค.

 

 

 

 

 

'๐ŸŽ iOS > Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift][iOS] GCD API ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํ•„์š”์„ฑ (1)  (0) 2023.06.13
[Swift][iOS] QOS  (0) 2023.06.13
[Swift] Struct์™€ Class์˜ ์ฐจ์ด์   (1) 2023.05.15