๐Ÿ“ฑ iOS/Base

    [Swift] ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ NetworkManager๋งŒ๋“ค๊ธฐ (feat. Generic)

    ์ง€๋‚œ๋ฒˆ์— ์ด๋Ÿฐ ๊ธ€์„ ์ผ์—ˆ๋Š”๋ฐ, https://990427.tistory.com/112 [Swift] json value type์ด ๋‹ฌ๋ผ์ง€๋Š” response์— ๋Œ€์‘ํ•˜์—ฌ API Responder๋งŒ๋“ค๊ธฐ ์š”์ฆ˜ Set์ด ๋œ ๋‚˜์˜ ๊ฐœ๋ฐœ ์Šคํƒ€์ผ,, ์ค‘๋ณต์„ ๋‹ค ์ œ๊ฑฐํ•ด๋ฒ„๋ฆฌ์ž ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ API๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์„ธํ–ˆ์Šต๋‹ˆ๋‹ค ๊ทธ๋ž˜์„œ ์–ด๋–ค api๋ฅผ ํ˜ธ์ถœํ•˜๋ƒ์— ๋”ฐ๋ผ form์˜ ๋ณ€ํ™”๋Š” ์—†์ง€๋งŒ data์˜ ๊ฐ’์€ ํ•ญ์ƒ 990427.tistory.com ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ์ ๋„ ์žˆ์—ˆ๊ณ , ๋ชจ๋“ˆ๋งˆ๋‹ค ๋‹ค ๋‹ค๋ฅธ MoyaProvider๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ๊นŒ ์ €๋ฒˆ์— ๋งŒ๋“  ํ•จ์ˆ˜์˜ ์“ฐ์ž„์ด ์ข€.. ๋ณ„๋กœ๋ž„๊นŒ? ๊ทธ๋ž˜์„œ ๊ฐœ์„ ํ•ด๋ณด์ž!๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  ์กฐ๊ธˆ๋” ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก BaseNetworkManager๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. Ba..

    [Swift] ์„œ๋ฒ„์— iOS ์ด๋ฏธ์ง€ ๋ณด๋‚ผ ๋•Œ ์šฉ๋Ÿ‰ ์ด์Šˆ & ํ•ด๊ฒฐ

    [Swift] ์„œ๋ฒ„์— iOS ์ด๋ฏธ์ง€ ๋ณด๋‚ผ ๋•Œ ์šฉ๋Ÿ‰ ์ด์Šˆ & ํ•ด๊ฒฐ

    ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ตฌํ˜„์ค‘์— ์ƒ๊ธด ์ด์Šˆ form-data๋กœ ์•„์ดํฐ ์‚ฌ์ง„์ฒฉ์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋ ค๋ฉด JPEG๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์•„์ดํฐ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ HEIF ํ™•์žฅ์ž๋กœ ์‚ฌ์ง„์„ ์ €์žฅํ•˜๋Š”๋ฐ, ์ด๋Š” ํ˜ธํ™˜์„ฑ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค ์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” PHPicker๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์ง„์ฒฉ์— ์žˆ๋Š” ์‚ฌ์ง„์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ jpeg๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด jpegData๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค image.jpegData(compressionQuality: 1.0) ์‚ฌ์‹ค ๋’ค์— 1.0์€ ๊ธฐ๋ณธ๊ฐ’์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์•„๋ฌด ์ƒ๊ฐ์—†์ด ์ผ๋Š”๋ฐ ์–˜๋•Œ๋งค ์ด์Šˆ๊ฐ€ ์ƒ๊ธธ์ค„์ด์•ผ... Moya๋ฅผ ํ†ตํ•ด API ํ†ต์‹ ์„ ํ•˜๋Š”๋ฐ, ๊ณ„์† ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š” ๊ฒƒ.. Failed to map data to a Decodable object. postman์œผ๋กœ ์•„์ดํฐ ์‚ฌ์ง„์ฒฉ์— ์žˆ๋Š” ์‚ฌ์ง„ ..

    [Swift] json value type์ด ๋‹ฌ๋ผ์ง€๋Š” response์— ๋Œ€์‘ํ•˜์—ฌ API Responder๋งŒ๋“ค๊ธฐ

    [Swift] json value type์ด ๋‹ฌ๋ผ์ง€๋Š” response์— ๋Œ€์‘ํ•˜์—ฌ API Responder๋งŒ๋“ค๊ธฐ

    ์š”์ฆ˜ Set์ด ๋œ ๋‚˜์˜ ๊ฐœ๋ฐœ ์Šคํƒ€์ผ,, ์ค‘๋ณต์„ ๋‹ค ์ œ๊ฑฐํ•ด๋ฒ„๋ฆฌ์ž ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ API๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์„ธํ–ˆ์Šต๋‹ˆ๋‹ค ๊ทธ๋ž˜์„œ ์–ด๋–ค api๋ฅผ ํ˜ธ์ถœํ•˜๋ƒ์— ๋”ฐ๋ผ form์˜ ๋ณ€ํ™”๋Š” ์—†์ง€๋งŒ data์˜ ๊ฐ’์€ ํ•ญ์ƒ ๋‹ฌ๋ผ์ง„๋‹ค ์ผ๋‹จ json์„ ํŒŒ์‹ฑํ•  struct๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๋ชจ๋“  api๋งˆ๋‹ค struct๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด ์ด๋Ÿฐ์‹์œผ๋กœ ๊ณ„์†ํ•ด์„œ DTO struct์˜ ์ค‘๋ณต์ด ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค ์ค‘๋ณต์ด ๋„ˆ๋ฌด ์‹ซ์€ ๋‚˜.. ์ œ๋„ค๋ฆญ์œผ๋กœ ๋ฌถ์ž! struct ResponseDTO : Decodable { var success : Bool var data : CommonDataDTO var error : ErrorDTO? } struct ErrorDTO : Decodable, Error { let code : Int let mes..

    [RxSwift] ๊ฐœ๋…์žก๊ธฐ (Subscribe, Observable, Subject)

    [RxSwift] ๊ฐœ๋…์žก๊ธฐ (Subscribe, Observable, Subject)

    ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•ด๋ณด๋Š” RxSwift iOS ๊ณต๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ฌด์กฐ๊ฑด ๋“ค์–ด๋ดค์„ RxSwift RxSwift๋Š” ReactiveX Swift์ธ๋ฐ์š”, reactiveX ? ๋Œ€์ถฉ ํ•ด์„ํ•˜๋ฉด ์˜ต์ €๋ฒ„๋ธ”์„ ์‚ฌ์šฉํ•ด์„œ ๋น„๋™๊ธฐ๋‚˜ event-based๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค ์˜ต์ €๋ฒ„๋ธ”์ด ๋ญ”๋ฐ ????? Observable ? ๋Œ€์ถฉ ํ•ด์„ํ•˜๋ฉด - ์˜ต์ €๋ฒ„๋Š” ์˜ต์ €๋ฒ„๋ธ”์„ ๊ตฌ๋…ํ•œ๋‹ค - ์˜ต์ €๋ฒ„๋Š” ์˜ต์ €๋ฒ„๋ธ”์ด ๋ฐฉ์ถœํ•˜๋Š” items์— ๋Œ€ํ•ด ๋ฐ˜์‘ํ•œ๋‹ค - ์˜ต์ €๋ฒ„๋Š” ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ , ๋ฐ˜์‘ํ•  ์ค€๋น„๋ฅผ ํ•œ ์–ด๋– ํ•œ ํ˜•ํƒœ๋กœ ๊ธฐ๋‹ค๋ฆฐ๋‹ค items์ด ์–ด๋–ค๊ฑด์ง€๋Š” ๋ชฐ๋ผ๋„ ์ผ๋‹จ ์˜ต์ €๋ฒ„๋Š” ์˜ต์ €๋ฒ„๋ธ”์ด ๋ญ”๊ฐ€๋ฅผ ํ•˜๋ฉด ๋ฐ˜์‘ํ•œ๋Œ€!! ์˜ต์ €๋ฒ„๊ฐ€ ๋ฌด์Šจ ํ˜•ํƒœ์ธ์ง€๋Š” ๋ชฐ๋ผ๋„ ์ผ๋‹จ ๋Œ€๊ธฐ ใ„ดใ„ด ์ฆ‰, sync ใ„ดใ„ด ๋งŽ์€ ์šฉ์–ด๋“ค์ด ๋‚˜์˜ค๋Š”๋ฐ Observer, Observable, Subscribe ๊ทผ๋ฐ ์ด..

    [Swift] Custom Calendar ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚  ๊ตฌํ•˜๊ธฐ

    [Swift] Custom Calendar ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚  ๊ตฌํ•˜๊ธฐ

    ์ด ๊ธ€์€ UI๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚ ์งœ ๊ณ„์‚ฐ์„ ํ•˜๋Š” ๋กœ์ง๋งŒ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค Custom Calendar๋ฅผ ๋งŒ๋“ค๋‹ค๋ณด๋‹ˆ ํ•ด๋‹นํ•˜๋Š” ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์ด ์–ธ์ œ์ธ์ง€ ๊ณ„์‚ฐํ•ด์•ผ ํ–ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฒ˜๋Ÿผ ์ ‘๊ทผํ•˜๋ฉด ์œค ๋‹ฌ๋„ ๊ณ„์‚ฐํ•ด์ค˜์•ผ ํ•˜๊ณ  ์†๋„ ์ธก๋ฉด์—์„œ๋„ ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ foundation์ƒ์— ์žˆ๋Š” calendar๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค! ๋จผ์ € ๋‚ ์งœ ๊ณ„์‚ฐ์— ํ•„์š”ํ•œ Calendar์™€ DateFormatter๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ž let calendar = Calendar(identifier: .gregorian) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" ์ฒซ ๋‚ ์€ ๋ฌด์กฐ๊ฑด 1์ผ์ด๋‹ˆ๊นŒ ์ง์ ‘ ์ž…๋ ฅํ•ด์ค€๋‹ค let st = dateFormatter.da..

    [Stanford iOS] ์•„ํ‚คํ…์ฒ˜ & MVC

    [Stanford iOS] ์•„ํ‚คํ…์ฒ˜ & MVC

    [Stanford iOS]๋Š” ํ•œ๊ธ€๋ง์ด ๋ฒˆ์—ญํ•œ Stanford iOS๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. [๋ฌด๋ฃŒ] Stanford iOS ํ•œ๊ธ€์ž๋ง‰ ๊ฐ•์˜ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜ ํ•œ๊ธ€๋ง์˜ ์ฒซ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ ์•„์ด์˜ค์—์Šค๋Š” ํ˜„์žฌ iTunes์—์„œ ๊ณต๊ฐœ๋œ Stanford - Developing iOS 9 Apps with Swift ๊ฐ•์˜๋ฅผ ๋ฒˆ์—ญํ•˜์˜€์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ... www.inflearn.com ์•„ํ‚คํ…์ณ MVC ๋””์ž์ธ ํŒจํ„ด iOS ๊ธฐ๋ณธ ๋””์ž์ธ ํŒจํ„ด ๐Ÿ“Œ Model What ํ”„๋กœ๊ทธ๋žจ์ด ํ•˜๋Š”์ผ, ์ฆ‰ ๋ชจ๋“  ๊ณ„์‚ฐ์„ ๋‹ด๋‹นํ•œ๋‹ค. UI์™€๋Š” ์ƒ๊ด€ ์—†๋Š” ์ผ์„ ์ฒ˜๋ฆฌํ•จ ๐Ÿ“Œ View UI == Client์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋Š” ๋ถ€๋ถ„ -> View ํ˜ผ์ž ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ๐Ÿ“Œ Controller How Model๊ณผ View ์—ฐ๊ฒฐ (View๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ณ ,..