Run loop - codeport/ios GitHub Wiki

์›๋ฌธ

Main event loop

๋ฉ”์ธ ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋“ค์–ด์˜ค๋Š” ์ด๋ฒคํŠธ๋“ค์„ ๊ฐ์ฒด๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ„์†ํ•ด์„œ ๋ผ์šฐํŒ…ํ•˜๊ณ  ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๋กœ UI์™€ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋Ÿฐ๋ฃจํ”„(run loop)์ด๋‹ค: ์Šค์ผ€์ฅด๋ง๋œ ์ผ๊ณผ ์ด๋ฒคํŠธ-ํ”„๋กœ์„ธ์‹ฑ ๋ฃจํ”„์™€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ธํ’‹์†Œ์Šค์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์˜ ์ขŒํ‘œ๋“ค์€ ๋Ÿฐ๋ฃจํ”„์— ์ถ”๊ฐ€๋œ๋‹ค. ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋Š” ๋Ÿฐ๋ฃจํ”„์— ์ ‘๊ทผํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ์—์„œ ๋Ÿฐ๋ฃจํ”„๋Š” ๋ฐ˜๋“œ์‹œ ์„ค์ •๋˜๊ณ  ์ฝ”๋“œ์—์„œ ์ˆ˜๋™์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค. ์ฝ”์ฝ”์•„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ๋ฅผ ์œ„ํ•œ ๋Ÿฐ๋ฃจํ”„(๋ฉ”์ธ ์ด๋ฒคํŠธ ๋ฃจํ”„)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด์— ์˜ํ•ด์„œ ์ž๋™์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ๋ฉ”์ธ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๊ตฌ๋ณ„ํ•ด ์ฃผ๋Š” ๊ฒƒ์€ ์ฃผ ์ธํ’‹์†Œ์Šค๊ฐ€ ์‚ฌ์šฉ์ž์•ก์…˜์œผ๋กœ ์ธํ•œ ์ด๋ฒคํŠธ๋ฅผ OS๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ™”๋ฉด์„ ํƒญํ•˜๊ฑฐ๋‚˜ ํ‚ค๋ณด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธ€์ž๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

run loop

The Application Object Gets and Dispatches Events

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋œ ์งํ›„ ๋ฉ”์ธ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์œ„ํ•œ ๊ธฐ๋ฐ˜์„ ์„ค์ •ํ•œ๋‹ค. ๋กœ์šฐ๋ ˆ๋ฒจ ์œ ์ € ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•  ์ฑ…์ž„์ด ์žˆ๋Š” ์˜์กด ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ์™€ ์—ฐ๊ฒฐ์„ ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์— ๋Ÿฐ๋ฃจํ”„์— ์„ค์น˜๋œ ์ธํ’‹์†Œ์Šค๋ฅผ ํ†ตํ•ด์„œ ๋ฐ›๋Š”๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฐ ์ด๋ฒคํŠธ๋ฅผ ๋„์ฐฉํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋กœ์šฐ๋ ˆ๋ฒจ ์ด๋ฒคํŠธ๋Š” FIFO ์ด๋ฒคํŠธ ํ์— ๋“ค์–ด๊ฐ„๋‹ค.

์ตœ์ดˆ ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์™ธ๋ถ€ ์ด๋ฒคํŠธ์— ์˜ํ•ด์„œ ์ฃผ๋„๋œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ ํ์˜ ์ตœ์ƒ์œ„์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ทจํ•ด์„œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ (iOS์—์„œ๋Š” UIEvent์ด๊ณ  Mac OSX์—์„œ๋Š” NSEvent์ด๋‹ค) ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋””์ŠคํŒจ์น˜ํ•œ๋‹ค. ๋””์ŠคํŒจ์น˜๋œ ์ด๋ฒคํŠธ๊ฐ€ ๋Œ์•„์™”์„ ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ์—์„œ ๋‹ค์Œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋””์ŠคํŒจ์น˜ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋ ๋•Œ ๊นŒ์ง€ ์ด๊ฒƒ์„ ๊ณ„์† ํ•œ๋‹ค.

Core Objects Respond to Events and Draw the User Interface

๋˜ํ•œ ์• ํ”Œ์ด์ผ€์ด์…˜์ด ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ UI๋ฅผ ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์˜ ์ฝ”์–ด๊ทธ๋ฃน์„ ์„ค์ •ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ฝ”์–ด ๊ฐ์ฒด๋“ค์€ winodws์™€ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ view๋ฅผ ํฌํ•จํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๊ฐ€ ์ด๋ฒคํŠธ ํ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์–ป์—ˆ์„ ๋•Œ ์œ ์ € ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚œ ์œˆ๋„์šฐ์— ๊ทธ๊ฒƒ์„ ๋””์ŠคํŒจ์น˜ํ•œ๋‹ค. ์œˆ๋„์šฐ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ์ ˆํ•œ ํ•ธ๋“ค๋Ÿฌ์ธ ๋ทฐ์— ๋ณด๋‚ธ๋‹ค:

  • ๋ฉ€ํ‹ฐํ„ฐ์น˜์™€ ๋งˆ์šฐ์Šค์ด๋ฒคํŠธ์—์„œ ๋ทฐ๋Š” ํ„ฐ์น˜๋‚˜ ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ ์•„๋ž˜ ์žˆ๋‹ค.
  • ํ‚ค๋ณด๋“œ, ๋ชจ์…˜, ๊ทธ์™ธ ์ด๋ฒคํŠธ์—์„œ๋Š” ๋ทฐ๋Š” ์ตœ์šฐ์„  ์‘๋‹ต์ž์ด๋‹ค.

์ด ์ตœ์ดˆ์˜ ๋ทฐ๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์‘๋‹ต์ž ์ฒด์ธ(responder chain)์„ ํ†ตํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค๋ฅธ ๋ทฐ๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌ์—์„œ ๋ทฐ๋Š” ์ข…์ข… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์™ธ๊ด€์„ ์ˆ˜์ •ํ•˜๊ณ  ์ƒํƒœ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์ผ๋ จ์˜ ์•ก์…˜๋“ค์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์•ก์…˜์ด ์™„๋ฃŒ๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ œ์–ด๊ฐ€ ๋Œ๋ ค์ ธ์„œ ์ด๋ฒคํŠธํ๋กœ๋ถ€ํ„ฐ ๋‹ค์Œ ์ด๋ฒคํŠธ๋ฅผ ์ทจํ•œ๋‹ค.

๊ทธ์™ธ ์ฐธ๊ณ  ๋ฌธ์„œ