Failed to build iOS appCould not build the precompiled application for the device. Error (Xcode): Target debug_unpack_ios failed: Exception: Failed to codesign /Users/i/Documents/flutter_memo/build/ios/Debug-iphoneos/Flutter.framework/Flutter with identity 0F5970B1325A2857E42BF850B01687CC2E5108A4. Error launching application on Jonghyuck’s iPhone. VSCode ์์ ์์ดํฐ ์ค๊ธฐ๊ธฐ๋ฅผ ์ฐ๊ฒฐํด์ ์ฝ๋๋ฅผ ๋๋ ค๋ดค๋๋ฐ ์์ ๊ฐ์ ์๋ฌ๋ฌธ๊ตฌ์ ํจ๊ป..
๐ฆ Flutter
๋คํธ์ํฌ ์์ฒญ์ด ์คํจํ์ ๋ ๋ฐ๋ก ์ฌ์ฉ์์๊ฒ ์คํจ๋ฌธ๊ตฌ๋ฅผ ๋์ฐ๋ ๊ฒ๋ณด๋ค 2๋ฒ๋ ์์ฒญํด๋ณด๊ณ ์ฌ์ฉ์์๊ฒ ์คํจ๋ฌธ๊ตฌ๋ฅผ ๋์ฐ๊ฒ ํ ์ ์๋ค. ๋ฐ๋ก retry() ์ฐ์ฐ์๋ฅผ ํตํด์์ด๋ค. retry(2) ๋ฅผ ํตํด ์ฒซ๋ฒ์งธ ์๋ + 2๋ฒ ๋์์ฒญ ํ์์๋ ์คํจํ๋ค๋ฉด catch() ์ฐ์ฐ์๋ฅผ ํตํด ์คํจ ์ด๋ฒคํธ๋ฅผ ์ก์๋ธ๋ค. enum SampleError: Error { case somethingWentWrong}func fetchData() -> AnyPublisher { let shouldFail = Bool.random() if shouldFail { print("Fetching data failed, will retry...") return Fail(error: SampleEr..
์ด์ ๊น์ง ์ปด๋ฐ์ธ ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ๋ฉด์ ํด์๋ ์๋ฌ์ฒ๋ฆฌ๋ค์ ๋ชจ๋ ์
์คํธ๋ฆผ์์ ์๋ฌ๋ฅผ ๋์ ธ์ฃผ๋ฉด ๋ค์ด์คํธ์์์ .sink ๋ฅผ ํตํด ๋ฐ๊ธฐ๋ง ํ๋ ์๋์ ์ธ ๋ฐฉ๋ฒ์ด์๋ค. ํ์ง๋ง ๋ง์ฝ ์๋ฌ๋ฅผ throwํ๋ ๋ฉ์๋๋ฅผ sink๋ฐ๊ธฐ์ ์ ์ฐ๊ณ sink์์ catchํ๊ณ ์ถ๋ค๋ฉด? ํน์ OOP๊ฐ๋
๊ณผ ํจ๊ป ์ปด๋ฐ์ธ์ ์ฐ๋ฉด์ ์ธํฐํ์ด์ค๋ก๋ถํฐ ๋์จ Stream์ ๋ฐ์ ๋ ๋ณดํต ์ถ์ํ๋ ์๋ฌ๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ sink๋ก ๋ฐ๊ธฐ์ ์ ๊ตฌ์ฒด ์๋ฌํ์
์ผ๋ก ๋ฐ๊ฟ์ผํ๋ค๋ฉด? .tryMap ์ฐ์ฐ์๋ฅผ ํตํด ์๋ฌ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค. enum APIError: Error { case networkError case dataCorrupted case invalidFormat}struct User { let id: Int let na..
๋ฐฑํ๋ ์
๊ด๋ฆฌ๋ ์ฃผ๋ก ๋ฐฑ์๋์์ ํ์ง๋ง Combine ํ๋ ์์ํฌ๋ฅผ ํ์ฉํด์ iOS ๋จ์์๋ ๊ด๋ฆฌ๋ฅผ ํด์ค ์ ์๋ค. ์ฌ๊ธฐ์ ๋ฐฑํ๋ ์
๋ ์๋ฒ๋ก๋ถํฐ ๋ ๋ผ์ค๋ ๋ฐ์ดํฐ ์๋๋ฅผ, ์ปด๋ฐ์ธ์ผ๋ก ํ์ ์ง์ผ๋ฉด ์
์คํธ๋ฆผ์์ ๋ ๋ผ์ค๋ ๋ฐ์ดํฐ ์๋๋ฅผ ๋ค์ด์คํธ๋ฆผ์ ์ฒ๋ฆฌ์๋๊ฐ ๋ฐ๋ผ๊ฐ์ง ๋ชปํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก ์์ ์ํฉ์ผ๋ก๋ ์๋์ ๊ฐ๋ค.๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ก๋ฉiOS ์ฑ์์ ์ธ๋ถ API๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ๋, ๋คํธ์ํฌ ์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ต ์๋์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ๋นจ๋ฆฌ ๋์ฐฉํ๋ฉด, ์ฑ์ ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋ธ๋ก๋๊ฑฐ๋ UI๊ฐ ๋๋ ค์ง ์ ์๋ค. ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ์ค์๊ฐ์ผ๋ก ๋ง์ ์์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ์ฑ(์: ๊ธ์ต ์ฑ์์์ ์ฃผ์ ๊ฐ๊ฒฉ ์
๋ฐ์ดํธ, ์คํฌ์ธ ์ฑ์์์ ์ค์๊ฐ ์ ์ ์
๋ฐ์ดํธ)์์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ฐฑ..
dataTaskPublisher() ๋ URLSession ์ ์ํด์๋ ์ปด๋ฐ์ธ ์ฐ์ฐ์๋ก ๋คํธ์ํฌ ์๋ต์ Publisher ๋ฅผ ํตํด ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. dataTaskPublisher(for:) ๋ฉ์๋๋ URL ์์ฒญ์ ๋ฐ์์ ์คํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Publisher ํํ๋ก ๋ฐํํฉ๋๋ค. ๋ฐํ๋ Publisher๋ ๋ค์๊ณผ ๊ฐ์ ํํ ํํ์ ์ถ๋ ฅ์ ๋ด๋ณด๋ธ๋ค -> (data, response)data: ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ Data ๊ฐ์ฒดresponse: ์์ฒญ์ ๋ํ ์๋ต ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ URLResponse ๊ฐ์ฒด ์ปด๋ฐ์ธ์์ Publishers๋ ๊ตฌ์กฐ์ฒด๋ก ์ ์๋์ด ๊ฐ์ผ๋ก ์ ๋ฌ๋๋ฉฐ, ๊ฐ๊ฐ์ ๋ณต์ฌ๋ณธ์ด ๋
๋ฆฝ์ ์ผ๋ก ์์
์ ์ํํ๋ค. ์ฌ๊ธฐ์ share() ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ํ๋์ด ๋ณ๊ฒฝ๋..
Sequencing Operators๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ด๋ค ์ฐ์ฐ์๋ ํผ๋ธ๋ฆฌ์
์์ ๋ฐฉ์ถ๋ ๋ฐ์ดํฐ ์์๋ค์ ์์๋ฅผ ์ ์งํ๊ฑฐ๋ ์์ ํ์ฌ ํน์ ์์
์ ์ํํ ๋ ์ค์ํ ์ญํ ์ ํ๋ค. ์ฌ๊ธฐ์ ๋น์ฐํ ์ง๋ฌธ์ด ๋ค์ด์ฌ ์ ์๋ค. ??: Transforming Operators ๋ ๋ณํํด์ ์ฒ๋ฆฌํ์์? ๋ ์ฐ์ฐ์ ์นดํ
๊ณ ๋ฆฌ์ ์ค์ํ ์ฐจ์ด์ ์ ๊ฐ ์์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ณํํ์ฌ ๋ค์ด์คํธ๋ฆผ์ ๋ด๋ ค๋ณด๋ด๋๋ ์คํธ๋ฆผ์ ์ ์ฒด ๊ตฌ์กฐ๋ ์์์ ์์์ ๊ด๋ จ๋ ์์
์ ์ํํ ๋ค์ด์คํธ๋ฆผ์ ๋ด๋ ค๋ณด๋ด๋๋์ด๋ค. Transforming Operators ๋ ๊ฐ๋ง๋ค ํ์ธํ ๋ณํ์ํค๊ณ , Sequencing Operators ๋ ์คํธ๋ฆผ์ ํ์ธ ํ ๋ณํ์ํจ๋ค. ์ฆ ๊ฐ๋ณ์ ์ธ ๊ฐ์ ํ๋ํ๋ ๋ณํ์ํค๋ ์คํธ๋ฆผ์ ํ..
Scheduler ํ๋กํ ์ฝ์ ๋ฌธ์๊ทธ๋๋ก ํด๋ก์ ๋ฅผ ์ธ์ , ์ด๋ป๊ฒ ์คํ์ํฌ์ง "์ค์ผ์ฅด๋ง"ํ๋ค. ์ฃผ์ํ ์ ์ ์ค์ผ์ฅด๋ฌ์ ์ค๋ ๋๋ ๋ค๋ฅด๋ค๋ ๊ฒ์ด๋ค! Scheduler ์ฐ์ฐ์์ค ํ๋์ธ Subscribe(on:) ์ฐ์ฐ์๋ถํฐ ์์๋ณด์. subscribe(on:) ์ฐ์ฐ์๋ ํผ๋ธ๋ฆฌ์
๊ฐ ์ด๋ ์ค์ผ์ฅด๋ฌ์์ ์์
์ ์ํํ ์ง ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ด๋ฅผํตํด ํผ๋ธ๋ฆฌ์
์ ๊ตฌ๋
์ด ์์ฑ๋๊ณ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋๋ ์ค๋ ๋ ๋๋ ํ๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ ํ ์ ์๋ค. Receive(on:) ์ฐ์ฐ์๋ ํผ๋ธ๋ฆฌ์
์ ์ถ๋ ฅ๊ฐ์ ํน์ ์ค์ผ์ฅด๋ฌ(์: ๋ฉ์ธ ์ค๋ ๋, ๋ฐฑ๊ทธ๋ผ์ด๋ ํ ๋ฑ)์์ ์์ ํ๋๋ก ์ง์ ํ ์ ์๊ฒ ํด์ค๋ค.. ์ด๋ฅผ ํตํด UI ์
๋ฐ์ดํธ, ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฑ์ ์์
์ ์ ์ ํ ์ค๋ ๋์์ ์ํํ ์ ์๋ค. Subscribe(on:) ๊ณผReceive(on:..
์ปด๋ฐ์ธ ํ์ต์ค ์์ ์ฝ๋์์ ๊ฝค๋ ์ ์ฉํ ํ๋กํ ์ฝ์ ์ ํ๊ฒ๋์๋ค. ๋ฐ๋ก CustomStringConvertible ํ๋กํ ์ฝ์ด๋ค. ์ด ํ๋กํ ์ฝ์ ์ฑํํ ๊ฐ์ฒด๋ description ํ๋กํผํฐ๋ฅผ ํ์์ ์ผ๋ก ๊ฐ์ง๊ฒ๋์ด ์์ ์ด ์ด๋ค๊ฐ์ฒด์ธ์ง ์ค๋ช
ํ ์ ์๊ฒ๋๋ค. ๊ฑฐ๋์ ๋ฏธํ๊ณ ์ํฉ๋ณ ์์ ๋ฅผ ํตํด ์์๋ณด์ 1. ๋๋ฒ๊น
๋ฐ ๋ก๊น
struct NetworkRequest: CustomStringConvertible { var url: String var method: String var headers: [String: String] var description: String { "Request to \(url) with method \(method) and headers \(headers)" ..
Combine์ ์คํธ๋ฆผ์ ๊ฒฐ๊ตญ ์๊ฐ์ ๋ฐ๋ผ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ ๋์ด์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฒคํธ ๋ฐ์์์ ์ ๋งค์ฐ ์ค์ํ๋ค. Timing ์ฐ์ฐ์๋ ์ด๋ฌํ ์ด๋ฒคํธ ๋ฐ์ ์์ ์ ๋ํด ์กฐ์ํ ์ ์๋ ์ฐ์ฐ์์ด๋ค. ๋จผ์ Delay ์ฐ์ฐ์๋ ๋ง๊ทธ๋๋ก ์ด๋ฒคํธ ๋ฐ์์์ ์ ๋ฆ์ถฐ์ฃผ๋ ์ฐ์ฐ์์ด๋ค. ์ด๋ ์ฃผ์์ฌํญ์ ๋ฆ์ถ๋ ์๊ฐ์ ๊ทธ๋ฅ Int๊ฐ์ผ๋ก ๋ฐ๋ ๊ฒ์ด ์๋ Dispatchqueue.SchedulerTimeTypes.Stride๋ก ๋ฐ๋๋ค. ๋ง์ฝ Int๊ฐ์ผ๋ก ์ฃผ๊ณ ์ถ๋ค๋ฉด for ํ๋ผ๋ฏธํฐ์ ๋ท ์ธ์ปจ๋ ๋ฑ์ผ๋ก ๋ฃ์ด์ฃผ์ด์ผํ๋ค. ๋ํ ๋ฉ์ธ ์ค๋ ๋์์ ๋๋ฆด๊ฑด์ง ๊ธ๋ก๋ฒ์์ ๋๋ฆด๊ฑด์ง๋ ์ง์ ํด์ค ์ ์๋ค. ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด collect(byTime) ์ฐ์ฐ์๋ ํน์ ์๊ฐ๋์ Upstream์ ์ด๋ฒคํธ๋ฅผ ๋ชจ์๋ค๊ฐ ๋ค์ด์คํธ๋ฆผ์ ๋ด๋ ค๋ณด๋ด์ฃผ๋ ..
Transforming ๊ณผ Filtering ์ ์ด์ด์ Combine ์ฐ์ฐ์๋ค์๋ํด ์์๋ณด์. ๋จผ์ Prepending ์ฐ์ฐ์์ด๋ค. prepend ์ฐ์ฐ์๋ ํ๋ ์ด์์ ๊ฐ์ ์คํธ๋ฆผ ์์ ์ถ๊ฐํ๋๋ฐ ์ฌ์ฉ๋๋ค. ๊ฐ์ ธ์ฌ ์คํธ๋ฆผ ์์ ์ด๋ฒคํธ๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ์ถ์ ๋ append์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์. Combining ์ฐ์ฐ์์ธ append ์ฐ์ฐ์๋ prepend ์ฒ๋ผ ๊ฐ์ด๋ ํผ๋ธ๋ฆฌ์
์ ๋ํด์ฃผ๋ ์ฐ์ฐ์์ง๋ง prepend๋ ์์๋ถ์ฌ์ฃผ์๋ค๋ฉด append๋ ๋ค์ ๋ถ์ฌ์ฃผ๋ ์ฐ์ฐ์์ด๋ค. switchToLatest ์ฐ์ฐ์๋ ์ค์ฒฉ๋ Publisher๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํฉ๋๋ค. Publisher๊ฐ ๋ ๋ค๋ฅธ Publisher๋ฅผ ๋ฐฉ์ถํ ๋ ์ฌ์ฉ๋๋ฉฐ, ์ต์ Publisher๊ฐ ๋ฐฉ์ถํ๋ ๊ฐ๋ง์ ๊ตฌ๋
ํ๊ณ ์ด์ ์ ๊ตฌ๋
ํ๋ Publisher๋..