[iOS] Multi-threading๊ณผ Concurrency(1) : Thread, Queue, Race Condition

ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ, ๋™์‹œ์„ฑ, ๋ณ‘๋ ฌ์„ฑ ๋“ฑ์€ iOS ๋ณด๋‹ค ๋” low-level๋กœ ๋“ค์–ด๊ฐ€ ์šด์˜์ฒด์ œ์™€ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ธ€์€ ๊ถ๊ทน์ ์œผ๋กœ GCD์™€ Operation Queue๋ฅผ ๋‹ค๋ฃจ๊ณ  ์‹ถ์œผ๋‹ˆ iOS ๊ฐœ๋ฐœ ๊ด€์ ์— ๋งž๊ฒŒ ๊ธ€์„ ํ’€์–ด๋ณผ๊ฒŒ์š”~ Concurrency ๋™์‹œ์„ฑ์€ ์—ฌ๋Ÿฌ ์ž‘์—…๋“ค์„ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ์งˆ์ž…๋‹ˆ๋‹ค. ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ์‹ฑ๊ธ€ ์ฝ”์–ด์—์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด๋‹ˆ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ '์ฒ˜๋Ÿผ' ๋ณด์ด๋Š” ์„ฑ์งˆ์ด์ฃ . ๋ฉ€ํ‹ฐ ์ฝ”์–ด ํ™˜๊ฒฝ์ด ํ•„์š”ํ•œ ๋ณ‘๋ ฌ์„ฑ(Parallelism)๊ณผ ์ž์ฃผ ๋น„๊ต๋˜๋Š” ๊ฐœ๋…์ด์ง€๋งŒ ์ด ๊ธ€์—์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์„๊ฒŒ์š”! ์ž‘์—…๋“ค์€ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰์ด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์— ๋น„์œ ํ•ด๋ณด์ž๋ฉด ์ฐจ = ์ž‘์—…, ์ฐจ์„  = ์Šค๋ ˆ๋“œ ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋ฒ„์Šค์ „์šฉ์ฐจ๋กœ๋Š” ๋ปฅ ๋šซ๋ ค์žˆ๋Š” ๋ฐ˜๋ฉด ์ผ..

iOS 2021. 11. 7. 05:26
[iOS] Frame vs Bounds

Frame๊ณผ Bounds๋Š” UIView์˜ CGRect๋กœ ํ‘œํ˜„๋˜๋Š” instance property๋“ค๋กœ, ์œ„์น˜์™€ ๊ด€๋ จ ๋œ ๊ฐ’์„ ์•Œ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์˜ ๊ฐ’์€ ์•„๋ž˜ ํ‘œ์™€ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, Frame Bounds ์ขŒํ‘œ superview์— ์˜ํ•ด ์ขŒํ‘œ ๊ฒฐ์ • ์ž๊ธฐ ์ž์‹ ๋งŒ์˜ ์ขŒํ‘œ๊ณ„ ์‚ฌ์šฉ ํฌ๊ธฐ(width, height) ์ž์‹ ๊ณผ ์™ธ์ ‘ํ•˜๋Š” ์ตœ์†Œ ์‚ฌ๊ฐํ˜•์˜ width, height ์ž๊ธฐ ์ž์‹ ์˜ width, height ์ขŒํ‘œ ์œ„ ํ‘œ์— ์˜ํ•˜๋ฉด frame์˜ ์ขŒํ‘œ๋Š” superview์— ์˜ํ•ด ๊ฒฐ์ •๋˜๊ณ  bounds๋Š” ์ž์‹ ์˜ ์ขŒํ‘œ๊ณ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์“ฐ์—ฌ์žˆ์Šต๋‹ˆ๋‹ค. ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ ๋ชจ๋‘ ๊ฐ™์€ ์œ„์น˜์— ๊ฐ™์€ UIView๊ฐ€ ๊ทธ๋ ค์ ธ์žˆ๋Š”๋ฐ์š”, Frame์€ superview์˜ (70, 40) ๋–จ์–ด์ง„ ์œ„์น˜์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ขŒํ‘œ๊ฐ€ (70, ..

iOS 2021. 10. 29. 20:14
[iOS] prepareForReuse๋ž€?

์ €๋„ ํ•„์š”์— ๋”ฐ๋ผ prepareForReuse๋ฅผ ์ž˜ ์“ฐ๊ณ  ์žˆ๋Š”๋ฐ์š”, ์ง€๋‚œ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์—์„œ๋„ ๋ช‡ ๋ฒˆ ์–ธ๊ธ‰์„ ํ–ˆ์—ˆ์–ด์š”. 1. [Rx] Resuable Cell์˜ ํ”์ ์ด ๋‚จ๋Š”๋‹ค [๋ฐ”๋กœ๊ฐ€๊ธฐ] 2. [Toy] collectionview์˜ cell์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ์ž˜ ์•ˆ๋œ๋‹ค [๋ฐ”๋กœ๊ฐ€๊ธฐ] ์ œ๋ชฉ์—์„œ๋„ ๋‘ ๊ธ€์˜ ๊ณตํ†ต์ ์ด ๋ณด์ด์ง€ ์•Š๋‚˜์š”?ใ…Žใ…Ž ์ฒซ ๋ฒˆ์งธ๋Š” UIScrollView๋ฅผ ์ƒ์†ํ•˜๋Š” view๋“ค์˜ cell๊ณผ ๊ด€๋ จ ๋œ ์ด์•ผ๊ธฐ๋ผ๋Š” ๊ฒƒ(UITableView, UICollectionView)์ด๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ๋ณ€ํ™”์— ๋Œ€ํ•œ ๋Œ€์‘์ด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„๋“ค์ด์ฃ . ์žฌ์‚ฌ์šฉ ๋˜๋Š” cell์„ dequeue ํ•  ๋•Œ ์ด์ „์— ์‚ฌ์šฉ ๋˜์—ˆ๋˜ ํ”์ ์ด ๋‚จ์„ ๋•Œ prepareForReuse๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ์„ ํ•˜๊ณค ํ–ˆ๋Š”๋ฐ์š”, ์ •ํ™•ํžˆ ์–ด๋– ํ•œ ์ด์œ ๋กœ, ์–ด๋–ค ๋ชฉ์ ์„ ์œ„ํ•ด ๋งŒ..

iOS 2021. 10. 19. 03:30
MVC์—์„œ MVP๋ฅผ ๊ฑฐ์ณ MVVM๊นŒ์ง€

๋ˆ„๊ตฐ๊ฐ€ ์ œ๊ฒŒ MVC, MVP, MVVM ๊ฐ๊ฐ์— ๋Œ€ํ•ด ์„ค๋ช…์„ ํ•ด๋ณด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์–ด๋ ดํ’‹์ด ์„ค๋ช…์€ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ๊ทธ๋Ÿฐ๋ฐ ์•„๋งˆ ๊ฐ ๊ฐ์ฒด์˜ ์—ญํ• ๊ณผ ๊ด€๊ณ„ ์ •๋„๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋”๋ผ๊ตฌ์š”. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ๋‚˜๋ฆ„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ, ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค์˜ ๊ธ€๊ณผ ์˜์ƒ์„ ์š”์•ฝํ•ด์„œ MVC, MVP, MVVM์˜ ํŠน์ง•์— ๋Œ€ํ•ด ์š”์•ฝํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. MVC VIEW CONTROLLER MODEL ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์Œ view๊ฐ€ ๋ฐ›์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์œผ๋กœ model ์—…๋ฐ์ดํŠธ, ์—…๋ฐ์ดํŠธ ๋œ ๋ชจ๋ธ๋กœ view๋ฅผ ์—…๋ฐ์ดํŠธ data์™€ ๊ด€๋ จ ์ด์ƒ์ ์ธ ๋ฐฉ์‹์€ delegation pattern์„ ์‚ฌ์šฉํ•œ view์™€ model์˜ ์ค‘๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ•  (ex. UITableView์˜ UITableViewDataSource) [ex] persist..

CS/๊ธฐํƒ€ 2021. 10. 19. 03:07
[iOS] ViewController์˜ ์ƒ๋ช…์ฃผ๊ธฐ

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“œ๋Š” ์•ฑ์€ ํ•˜๋‚˜ ์ด์ƒ์˜ UIViewController๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹จ์ผ ํ™”๋ฉด์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ Container View Controller๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์„œ ํ™”๋ฉด ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•˜๊ฒ ์ฃ ? ํ™”๋ฉด๊ณผ ๊ธฐ๋Šฅ์ด ๋‹ค์–‘ํ•ด์งˆ ์ˆ˜๋ก ์ƒˆ๋กœ์šด ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๊ณ  ์—†์–ด์ง€๋Š” ์‹œ์  ๋˜๋Š” ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ์‹œ์ ์— ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ๋“ค์ด ์žˆ์„๊ฑฐ์—์š”. ์ƒˆ๋กœ ๋ณด์—ฌ์งˆ ํ™”๋ฉด์˜ UI ์š”์†Œ๋“ค์„ ์ž˜ ๋ฐฐ์น˜ํ•œ๋‹ค๋˜์ง€, ํ˜„์žฌ ํ™”๋ฉด์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ๋„คํŠธ์›Œํฌ task๋ฅผ ๋Š๋Š”๋‹ค๋˜์ง€ ๋“ฑ. ๋•Œ๋ฌธ์— View Controller์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ž˜ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋” ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ ์ƒ์— ์ด ๊ทธ๋ฆผ์€ Handling View-Related Notifications ์ œ๋ชฉ ๋ฐ‘์— ์†ํ•ด์žˆ์Šต๋‹ˆ๋‹ค. ์› ์•ˆ์—๋Š” ๊ฐ€์‹œ ์ƒํƒœ(visibility)..

iOS 2021. 10. 15. 07:30
[iOS] AutoLayout์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

Auto Layout์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ์–ด์š”. [1] Layout Anchor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• [2] NSLayoutConstraint class๋ฅผ ์ง์ ‘ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• [3] Visual Format Language๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ฐ๊ฐ์„ ํ•˜๋‚˜์”ฉ ์žฅ๋‹จ์ ๊ณผ ํ•จ๊ป˜ ์‚ดํŽด๋ณผ๊นŒ์š”? Layout Anchor ์ €ํ•œํ…Œ ๊ฐ€์žฅ ์ต์ˆ™ํ•œ ๋ฐฉ๋ฒ•์€ ์ œ์ผ ์ฒซ๋ฒˆ์งธ์ธ layout anchor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. ์ œ์•ฝ์„ ์ฃผ๊ณ  ์‹ถ์€ item์˜ anchor property์— ์ ‘๊ทผํ•ด์„œ ์ œ์•ฝ์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์žฅ์ ์œผ๋กœ๋Š”, 1. ๊ฐ„๊ฒฐํ•œ ์ž‘์„ฑ ๋ฐฉ์‹์œผ๋กœ ์ธํ•œ ๋›ฐ์–ด๋‚œ ๊ฐ€๋…์„ฑ 2. type safety๋ฅผ ์ง€์› ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ NSLayoutConstraint class๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด constraint in..

iOS 2021. 10. 11. 17:51
[iOS] iOS ๋ฉด์ ‘ ์งˆ๋ฌธ ์ •๋ฆฌ

์ง‘๋‹จ ์ง€์„ฑ์œผ๋กœ ๋ชจ์ธ ๋‹ค์–‘ํ•œ ๋ฉด์ ‘ ์งˆ๋ฌธ๋“ค์„ ๋ชจ์•„ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”. ์ถœ์ฒ˜๋Š” ๋ชจ๋‘ ์•„๋ž˜์— ๋ช…์‹œํ•ด ๋†“์•˜๊ณ , ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์ฑ„์›Œ๋ณด๋„๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! iOS Frame๊ณผ Bounds์˜ ์ฐจ์ด [๋ฐ”๋กœ๊ฐ€๊ธฐ] ViewController์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค. [๋ฐ”๋กœ๊ฐ€๊ธฐ] setNeedsLayout์™€ setNeedsDisplay์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค. App์˜ Not running, Inactive, Active, Background, Suspended์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค. ์•ฑ์ด In-Active ์ƒํƒœ๊ฐ€ ๋˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค. URLSession์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค. [๋ฐ”๋กœ๊ฐ€๊ธฐ] prepareForReuse์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค. [๋ฐ”๋กœ๊ฐ€๊ธฐ] Auto Layout AutoLayout์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•..

iOS 2021. 10. 11. 01:04