์‹œํ–‰์ฐฉ์˜ค 4

[ iOS ์‹œํ–‰์ฐฉ์˜ค ] URLSession์œผ๋กœ multipart/form-data ์š”์ฒญ

๐Ÿ‘ฉ‍๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉ‍๐Ÿ’ป์•จ๋ฒ”์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•ด ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š” ์ž‘์—…์ด ์ฃผ์–ด์กŒ๋‹ค. ์ด์ „์— ๋ช‡ ๋ฒˆ ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„๋ณธ ๊ฒฝํ—˜์ด ์žˆ์–ด ๋ฌด๋ฆฌ๊ฐ€ ์—†์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๊ทธ๋•Œ๋Š” 3rd party์ธ Alamofire๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด์„œ ๊ฐ„๋‹จํ–ˆ์—ˆ๊ณ  ์ง€๊ธˆ์€ Apple์˜ built-in์ธ URLSession์„ ์‚ฌ์šฉํ•ด์•ผํ•ด์„œ ๋งŽ์ด ํ—ท๊ฐˆ๋ ธ๋‹ค.   ๐Ÿ˜ฎ cURL Vs HTTPAPI๋ฌธ์„œ๋Š” ํ‘œํ˜„์˜ ์ฐจ์ด ๋“ฑ์œผ๋กœ iOS๋งŒ ์•Œ๊ณ  ์žˆ์–ด์„œ๋Š” ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ๋™์•ˆ ํ•ด์™”๋˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๊ฒฝํ—˜๊ณผ ๊ตฌ๊ธ€๋ง์„ ๋ฐ”ํƒ•์œผ๋กœ ์ง€๊ธˆ๊นŒ์ง€ ์ž˜ ์ดํ•ดํ•˜๋ฉฐ ์—ฐ๊ฒฐํ•ด์™”๋‹ค. ์˜ค๋žœ๋งŒ์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์„œ๋ฒ„ ์—ฐ๊ฒฐ์„ ํ•˜๋ ค๊ณ  ๋ณด๋‹ˆ API๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ๋‚ด๊ฐ€ ๋”ฐ๋กœ ์ฐพ์•„ ๊ณต๋ถ€ํ–ˆ๋˜ mutipart/form-data ์—ฐ๊ฒฐ ๊ตฌ์กฐ์™€๋Š” ๋งŽ์ด ๋‹ฌ๋ผ ๋ฐฉ๋ฒ•์ด ๋‹ค์–‘ํ•œ๊ฑด๊ฐ€ ์‹ถ์–ด ๊ตฌ๊ธ€๋ง์„ ์ •๋ง ..

[ iOS ์‹œํ–‰์ฐฉ์˜ค ] CollectionView์˜ Section ์ˆจ๊ธฐ๊ธฐ -CompositionalLayout

๐Ÿ‘ฉ‍๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉ‍๐Ÿ’ป ์›๋ž˜ Section์ด ํ•œ ๊ฐœ์˜€๋˜ collection view๋ฅผ ๋‘ ๊ฐœ๋กœ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์•„์ดํ…œ์ด ์•„๋ฌด๊ฒƒ๋„ ์—†์œผ๋ฉด ๊ทธ๋ƒฅ ํ……- ๋นˆ ๊ณต๊ฐ„์ด ๋‚จ๊ฒŒ ๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ข‹์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•„ ์•„์ดํ…œ์ด ์—†์„ ๊ฒฝ์šฐ Section์„ ์ˆจ๊ธฐ๊ณ ์ž ๊ณ„ํšํ–ˆ๋‹ค. How to deal with empty items section Section์„ ์ ‘๋Š” ๊ฑด ์ž์ฃผ ๋ณด์ด๋Š” ๊ธฐ๋Šฅ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ด€๋ จ ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์ง€ ์•Š์„๊นŒ ๊ณต์‹๋ฌธ์„œ์„ ์—ด์‹ฌํžˆ ์ฐพ์•„๋ณด์•˜์ง€๋งŒ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์‹œ ๋˜ ์—ด์‹ฌํžˆ ๊ตฌ๊ธ€๋ง์„ ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž์ฃผ ๋ดค๋˜ Section ์ˆจ๊น€ ๊ธฐ๋Šฅ์€ ๋ณดํ†ต TableView๋ฅผ ํ™œ์šฉํ•œ ๊ฒƒ์ด๊ฑฐ๋‚˜ FlowLayout์„ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ๋Š”๋ฐ, ๋‚˜๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ Section์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค ๊ณ„ํš์ด..

[ iOS ์‹œํ–‰์ฐฉ์˜ค ] CollectionView ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ (Performing reloadData as a fallback — Invalid update)

๐Ÿ‘ฉ‍๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉ‍๐Ÿ’ป CollectionView๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด cell ์‚ญ์ œ, ์ถ”๊ฐ€, ๋ณ€๊ฒฝ ๋“ฑ ๋‹ค์–‘ํ•œ ์ด์œ ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋•Œ reloadData, reloadSection, deletedItem, insertItem ๋“ฑ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๊ด€๋ จํ•˜์—ฌ CollectionView์˜ ๋ ˆ์ด์•„์›ƒ์„ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ [UICollectionView] Performing reloadData as a fallback — Invalid update: invalid number of items in section 0. ... deleteItem ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด CollectionView๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค ํ•˜๋Š”๋ฐ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  collectionView์— ์–ด๋– ํ•œ ๋ณ€ํ™”๋„ ์—†์—ˆ๋‹ค..

[ iOS/Git ์‹œํ–‰์ฐฉ์˜ค ] Push๋œ Info.plist๋ฅผ .gitignore์— ํ• ๋‹นํ•˜๊ธฐ

๐Ÿ‘ฉ‍๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉ‍๐Ÿ’ป ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค๋ณด๋ฉด ํ† ํฐ ๋“ฑ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. Local ์ €์žฅ์†Œ์—์„œ๋งŒ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ์— ๋Œ€ํ•ด ํฌ๊ฒŒ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ, Github๊ณผ ๊ฐ™์€ ์›๊ฒฉ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋งŒ์•ฝ ๋ฏธ์ฒ˜ ์‹ ๊ฒฝ ์“ฐ์ง€ ๋ชปํ•˜๊ณ  ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์›๊ฒฉ ์ €์žฅ์†Œ์— ์˜ฌ๋ฆฌ๊ฒŒ ๋œ๋‹ค๋ฉด ํ•ดํ‚น์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  bundle์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋„ ๊น”๋”ํ•ด์ง€๊ณ  ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ๋„ ํŽธ๋ฆฌํ•ด์„œ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒˆ๋“ค๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ์ข‹๋‹ค. ์ด์™€ ๊ฐ™์€ ์ด์œ ๋กœ ์ค‘์š”ํ•œ ์ •๋ณด๋“ค์„ Info.plist ๋„ฃ๊ณ  ์ด plist ํŒŒ์ผ์„ .gitignore์— ์ถ”๊ฐ€ํ•˜๋ ค ํ–ˆ๋‹ค .gitignore์— ํŒŒ์ผ ์ถ”๊ฐ€ํ•˜๊ธฐ .gitignore์— ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๊ฐ„๋‹จํ•˜๋‹ค. .gitignore ํŒŒ์ผ์„ ์—ด๊ณ  ์›ํ•˜๋Š”..

728x90