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 에서 아이폰 실기기를 연결해서 코드를 돌려봤는데 위와 같은 에러문구와 함께..
전체 글
네트워크 요청이 실패했을 때 바로 사용자에게 실패문구를 띄우는 것보다 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..
지난 강의까지 네트워크 레이어를 다루었다. 이번시간부터는 링크레이어를 다룬다. 여러 클라이언트가 게이트웨이 라우터에 함께 진입한다. 이때 네트워크 계층에서 패킷을 보내면 도식화된 그래프처럼 한 줄로 쭉 연결되서 가는 것이 아닌 여러 컴퓨터들이 네트워 계층에 물려 진행된다. 이때 서로 다른 클라끼리 collision이 발생하여 신호가 섞일 수 있다. Link 레이어는 클라끼리 충돌발생을 막는 역할을한다 혹은 충돌이 발생했을 때 문제를 해결한다. 이러한 일이 링크레이가 맡는 가장 주요한 일이다. 트랜스포트레이어와 네트워크레이어는 OS내부에 코드로 구현되어 있다. 링크레이어부터는 하드웨어 단으로 가는데 바로 Network Interface Card(NIC) 에 위치하고 있다. 링크레이어는 프레임을 내려보낸..
이전까지 컴바인 프레임워크를 이용하면서 해왔던 에러처리들은 모두 업스트림에서 에러를 던져주면 다운스트임에서 .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의 이벤트를 모았다가 다운스트림에 내려보내주는 ..