๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
iOS ๐ŸŽ/iOS

Main Run Loop & Update Cycle

by yongmin.Lee 2022. 1. 24.

view update methods

 

์ด ํฌ์ŠคํŠธ๋Š”  view, layout ์—…๋ฐ์ดํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •๋ฆฌํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์—ฐ๊ด€์ง€์‹์„ ๋จผ์ € ์„ค๋ช…์„ ํ•˜๊ณ  view, layout ์—…๋ฐ์ดํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ค๋ช…ํ•  ์˜ˆ์ •. ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

1. Main Run Loop

2. Update Cycle

3. constraints ์—…๋ฐ์ดํŠธ

4. layouts ์—…๋ฐ์ดํŠธ 

5. display ์—…๋ฐ์ดํŠธ

6. Drawing Cycle

 


 

1. Main Run Loop

main run loop and update cycle

์•ฑ์ด ์‹คํ–‰๋˜์–ด ์‹œ์Šคํ…œ์—์„œ ์ผ์–ด๋‚˜๋Š” ํ”„๋กœ์„ธ์Šค๋“ค์„ https://yongminlee26.tistory.com/204 ์— ์ •๋ฆฌํ–ˆ์—ˆ๋‹ค.

์•ฑ์ด ์‹คํ–‰๋˜๋ฉด UIApplication ๊ฐ์ฒด๋Š” ์œ ์ €๊ฐ€ ์ผ์œผํ‚ค๋Š” ์ด๋ฒคํŠธ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค Main Run Loop๋ฅผ ์‹คํ–‰ ํ•˜์—ฌ

์œ ์ €๋กœ๋ถ€ํ„ฐ์˜ input ์ด๋ฒคํŠธ๋ฅผ ํ•ด์„ํ•˜๊ณ  ๊ทธ์— ์ƒ์‘๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Core object๋“ค ์•ˆ์— ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•ด์ค๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋Ÿฌ๋“ค์€ ์šฐ๋ฆฌ, ๊ฐœ๋ฐœ์ž๋“ค์ด ์“ด ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋“ค์ด ๋ฐ˜ํ™˜๋˜๋ฉด ๋‹ค์‹œ ์ปจํŠธ๋กค์€ main run loop๋กœ ๋Œ์•„๊ฐ€๊ณ 

View ๋“ค์„ ๋ฐฐ์น˜ํ•˜๊ณ  ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ์—ญํ• ์„ ํ•˜๋Š” Update Cycle์ด ์‹œ์ž‘๋œ๋‹ค


2. Update Cycle

  • ์‹œ์Šคํ…œ์€ Update Cycle์—์„œ  UIView์˜ ๋ชจ๋“  ๋ณ€ํ™”๋ฅผ ์ˆ˜ํ–‰
  • iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ดˆ๋‹น 60ํ”„๋ ˆ์ž„์„ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ €๋Š” UI์™€ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๋Š๋ผ์ง€ ๋ชปํ•˜์ง€๋งŒ, ์ด๋ฒคํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ์‹œ์ ๊ณผ ์‹ค์ œ๋กœ View๊ฐ€ ๋‹ค์‹œ ๊ทธ๋ ค์ง€๋Š” ์‹œ์ ์— ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, View๋Š” ์šฐ๋ฆฌ๊ฐ€ View๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” run loop์˜ ํŠน์ • ์‹œ์ ์— ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด๊ฒฐ๋ฐฉ์•ˆ :  constraints, layouts, contenst ์—…๋ฐ์ดํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉ
  • Auto layout์—์„œ ๋ทฐ๊ฐ€ ๋ ˆ์ด์•„์›ƒ๋˜๊ณ  ๋‹ค์‹œ ๊ทธ๋ ค์ง€๋Š” ๊ณผ์ •์€ ์„ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰œ๋‹ค
    1. constraints ์„ธํŒ… : ๋จผ์ € ๋ทฐ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ œ์•ฝ๋“ค์„ ์„ธํŒ…
    2. layout ๋ฐฐ์น˜ : ๋ ˆ์ด์•„์›ƒ ์—”์ง„์ด ๋ทฐ์™€ ๋ชจ๋“  ํ•˜์œ„๋ทฐ์˜ ํ”„๋ ˆ์ž„(์ขŒํ‘œ+์‚ฌ์ด์ฆˆ)์„ ๊ณ„์‚ฐํ•ด์„œ ์žฌ๋ฐฐ์น˜
    3. display : ๋ทฐ์˜ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฐ๋‹ค.

3. Constraints ์—…๋ฐ์ดํŠธ 

updateConstraints()

์˜คํ†  ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ทฐ์˜ constraints๋“ค์„ ๋™์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฉ”์†Œ๋“œ.

updateConstraints๋Š” ์˜ค์ง ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

constraints์„ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•˜๋Š”๊ฒฝ์šฐ ์‹œ์Šคํ…œ์—๊ฒŒ updateConstraints()๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์š”์ฒญ ํ•ด์•ผํ•œ๋‹ค.

 

setNeedsUpdateConstraints()

๋‹ค์Œ ์—…๋ฐ์ดํŠธ ์‹ธ์ดํด์—์„œ ์ œ์•ฝ์‚ฌํ•ญ๋“ค์— ๋Œ€ํ•œ ๊ฐฑ์‹ ์ด ์ผ์–ด๋‚˜๋„๋ก updateConstraints๋ฅผ ์˜ˆ์•ฝํ•˜๋Š” ๋ฉ”์†Œ๋“œ.

 

updateConstraintsIfNeeded()

์˜คํ†  ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ทฐ์— ๋Œ€ํ•ด์„œ ์ฆ‰์‹œ updateConstraints ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์‹œ์Šคํ…œ์—๊ฒŒ ์š”์ฒญํ•˜๊ณ  ๋Ÿฐ ๋ฃจํ”„๊ฐ€ ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ.


4. Layouts ์—…๋ฐ์ดํŠธ ๋ฉ”์†Œ๋“œ

layoutSubviews()

์ด ๋ฉ”์†Œ๋“œ๋Š” UIView์˜ ๋ฉ”์†Œ๋“œ๋กœ ํ•ด๋‹น ๋ทฐ์™€ ๋ชจ๋“  ํ•˜์œ„๋ทฐ์˜ repositioning, resizing์„ handleํ•œ๋‹ค.

๋ทฐ์˜ ํ”„๋ ˆ์ž„์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผํ•  ๋•Œ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํ•ด๋‹น๋ทฐ์™€ ๋ชจ๋“  ํ•˜์œ„๋ทฐ์— ๋Œ€ํ•ด์„œ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— expensiveํ•˜๋ฏ€๋กœ ์ด ๋ฉ”์†Œ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์„œ๋Š” ์•ˆ๋˜๊ณ , ์‹œ์Šคํ…œ์ด ํ˜ธ์ถœํ•˜๋„๋ก ๋‘ฌ์•ผํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ์‹œ์Šคํ…œ์œผ๋กœ ํ•˜์—ฌ๊ธˆ layoutSubview()๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์š”์ฒญํ•ด์•ผํ•˜๋Š”๋ฐ ์ด๋•Œ setNeedsLayout, layoutIfNeeded ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค. ๋ฉ”์†Œ๋“œ๋“ค์€ ์—…๋ฐ์ดํŠธ ์‹ธ์ดํด์ด ์•„๋‹ˆ๋ผ ๋ฉ”์ธ ๋Ÿฐ ๋ฃจํ”„ ์‹œ์ ์— layoutSubviews๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค

 

setNeedsLayout()

์ด ๋ฉ”์†Œ๋“œ๋Š” ์‹œ์Šคํ…œ์œผ๋กœ ํ•˜์—ฌ๊ธˆ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋ทฐ์˜ ๋ ˆ์ด์•„์›ƒ์ด ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๊ณ  ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋œ๋‹ค. 

๋Œ€์‹ , ๋ทฐ๋Š” ๋‹ค์Œ ์—…๋ฐ์ดํŠธ ์‹ธ์ดํด์— ๊ฐฑ์‹ ๋œ๋‹ค.

 

layoutIfNeeded()

๋‹ค์Œ ์—…๋ฐ์ดํŠธ ์‹ธ์ดํด์— layoutSubviews๋ฅผ ์˜ˆ์•ฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ์—๊ฒŒ ์ฆ‰์‹œ(immediately) ๋ ˆ์ด์•„์›ƒ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฐฑ์‹ ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•œ๋‹ค.

๋‹ค์Œ ์—…๋ฐ์ดํŠธ ์‹ธ์ดํด๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ layoutSubviews๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™๊ธฐ ๋ฉ”์†Œ๋“œ์ด๋‹ค.


5.  Display ์—…๋ฐ์ดํŠธ ๋ฉ”์†Œ๋“œ

Display

๋””์Šคํ”Œ๋ ˆ์ด๋Š” ๋ทฐ์™€ ํ•˜์œ„๋ทฐ์—์„œ sizing, positioning์„ ๋™๋ฐ˜ํ•˜์ง€ ์•Š๋Š” ์š”์†Œ๋“ค์„ ํฌํ•จํ•œ๋‹ค.

=> ์ƒ‰์ƒ, ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€, ์ฝ”์–ด ๊ทธ๋ž˜ํ”ฝ์Šค ๋“ฑ๋“ฑ

 

draw(_: )

UIView๋Š” draw ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋ทฐ์˜ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฐ๋‹ค.

draw ๋ฉ”์†Œ๋“œ๋Š” ํ•˜์œ„๋ทฐ์— ๋Œ€ํ•ด ์—ฐ์‡„์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

draw ๋ฉ”์†Œ๋“œ๋Š” ์‹œ์Šคํ…œ์ด ํ˜ธ์ถœํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋Š” ์‹œ์Šคํ…œ์—๊ฒŒ draw๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ• ๊ฒƒ์„ ์š”์ฒญํ•œ๋‹ค.

 

setNeedsDisplay()

๋ทฐ์˜ ์ปจํ…์ธ  ๊ฐฑ์‹ ์„ ์˜ˆ์•ฝํ•˜๊ณ  ๋ฐ˜ํ™˜๋˜๋ฉฐ ๋‹ค์Œ ์—…๋ฐ์ดํŠธ ์‹ธ์ดํด์—์„œ ์‹œ์Šคํ…œ์€ ๋ชจ๋“  ๋ทฐ๋“ค์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๊ฐฑ์‹ ์š”์ฒญ์ด ๋งˆํฌ๋˜์—ˆ๋‹ค๋ฉด draw()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. 

 

displayIfNeeded()

๋‹ค์Œ ์—…๋ฐ์ดํŠธ ์‹ธ์ดํด์— draw()๋ฅผ ์˜ˆ์•ฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ์—๊ฒŒ ์ฆ‰์‹œ(immediately) display ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฐฑ์‹ ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•œ๋‹ค.

๋‹ค์Œ ์—…๋ฐ์ดํŠธ ์‹ธ์ดํด๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ draw()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™๊ธฐ ๋ฉ”์†Œ๋“œ์ด๋‹ค.


6. Drawing Cycle

  • ๋ทฐ๊ฐ€ ๋กœ๋“œ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํ™”๋ฉด์— ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„๋˜์–ด ๊ทธ๋ ค์ง€๋Š” ์ผ์ข…์˜ ์‚ฌ์ดํด
  1. ๋ทฐ ๋กœ๋“œ ์‹œ ์‹œ์Šคํ…œ์ด UIView์—๊ฒŒ draw๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋“œ๋กœ์ž‰์„ ์š”์ฒญํ•œ๋‹ค.
  2. ๋ทฐ์˜ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•˜์—ฌ UIView์—๊ฒŒ ์ „๋‹ฌ
  3. ๋ทฐ์˜ ์ปจํ…์ธ  ๋ณ€๊ฒฝ ์‹œ ๊ด€๋ จ ๋ฉ”์†Œ๋“œ (setNeedsDisplay, setNeedsLayout ๋“ฑ๋“ฑ...) ํ˜ธ์ถœํ•˜์—ฌ ์‹œ์Šคํ…œ์— ์—…๋ฐ์ดํŠธ ์š”์ฒญ
  4. Next Drawing Cycle์—์„œ ์—…๋ฐ์ดํŠธ ์š”์ฒญ ๋ฐ›์€ ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธ

์Šค๋ƒ…์‚ฟ์„ ํ†ตํ•ด์„œ ์ด์ „ ํ™”๋ฉด๊ณผ ๋ณ€๊ฒฝ์ด ์—†๋‹ค๋ฉด? drawing cycle์€ ๋Œ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ

https://velog.io/@leeyoungwoozz/iOS-View-Layout-Cycle

https://medium.com/mj-studio/%EB%B2%88%EC%97%AD-ios-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83%EC%9D%98-%EB%AF%B8%EC%8A%A4%ED%84%B0%EB%A6%AC%EB%A5%BC-%ED%8C%8C%ED%97%A4%EC%B9%98%EB%8B%A4-2cfa99e942f9

https://sihyungyou.github.io/iOS-setNeedslayout-layoutIfNeeded/

https://zeddios.tistory.com/359

 

 

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

Frame-base layout vs Auto layout  (0) 2022.03.02
translatesAutoresizingMaskIntoConstraints ์†์„ฑ  (0) 2022.02.23
Notification Service Extension  (0) 2021.12.06
App Extension  (0) 2021.12.06
Xcode Target, Project, Workspace  (0) 2021.12.06