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는..
Flutter Widget Rendering Flutter widget의 렌더링 순서는 위와같다. 1. 먼저 사용자의 인풋을 받아들이고 2. 시간에 따라 UI를 움직이고, 3. 스크린에 위젯을 만들고 4. 스크린 위에서 위치를 잡고, 5. 위치잡은 위젯의 직접적인 내부 구현물을 채우고, 6. 위치와 내부가 채워진 위젯들의 겹쳐진 순서를 ordering 한 뒤에 7. 지금까지 한 작업들을 GPU가 이해할 수 있는 명령어로 바꾸어 실제 화면에 렌더링을 한다. 렌더링 과정은 크게 렌더링 파이프라인과 Graphics 파이프라인으로 나뉘고 각각 다른 스레드를 사용한다. Rendering Pipeline 은 UIThread에서 실행되며 총 5단계 phase로 나누어진다. (위에 나온2,3,4,5,6) Grap..
이전의 Transport 레이어까지 세그먼트를 보내는데 있어서 유실되면 다시 재전송하는등 어떻게 reliable한 transfer를 할 것 인가에 집중했다면 IP부터, 즉 Network 레이어부터는 어떻게 패킷을 receiver에 안전하게 보낼 것인가에 대해 다룬다. 따라서 네트워크레이어의 IP는 패킷을 어떻게 목적지까지 배송할 것인가라는 역할을 맡는다. 이전에 말한 것처럼 라우터가 패킷을 받으면 패킷을 검사하는 시간을 가진다. 여기서 패킷의 목적지, 헤더의 checksome을 통해 에러 유무를 확인한다. 여기서 소요되는 시간을 Processing Delay 라고 배웠었다. 결국 라우터의 핵심적인 일은 패킷을 받으면 어디로 패킷을 보낼지 방향을 설정하는 것이다. 이렇게 올바른 목적지로 쏘는 작업을 fo..
Filtering 카테고리 연산자들은 Publisher로부터 값을 받아서 설정해놓은 조건에 맞는 녀석들만 다운스트림으로 내려보내는 연산자이다. 앞선 transforming 연산자들과 비교했을 때 업스트림으로부터 내려오는 값을 바꾸는 것이 아닌 걸러내는 역할을 수행한다. 먼저 Filter() 연산자가 있다. 가장 단순한 필터 연산자로 원하는 조건에 따라 필터링해서 다운스트림에 내려보낸다. removeDuplicate() 연산자는 이름 그대로 중복된 값들을 제거해주고 다운스트림에 내려보낸다. compactMap 은 nil을 필터링한 밸류값을 다운스트림에 전달한다 위코드예시에서 Int값으로 변환이 되지 않은 밸류는 필터링하고 변환된 값만 다운스트림에 내려보내는 것을 알 수 있다. ignoreOutpu..
요약뷰의 드로잉 사이클에는 크게 3가지가 있습니다. 먼저 Constraints(제약)을 업데이트하고 재배치하고 다시 뷰를 그리는 방식입니다. 구체적인 메서드로는 오토레이아웃을 업데이트 하는 updateConstraints(), 하위 뷰의 레이아웃 위치와 크기를 재조정하는 layoutSubviews(), 색상/이미지/텍스트 등 실제 내부 컨텐츠를 다시 그리는 draw() 메서드가 있습니다., 부가설명app이 실행되면 iOS의 UIApplication이 Main Thred에서 main run loop를 실행시킨다. 메인런루프는 화살표대로 한바퀴씩 돌며 이벤트를 처리한다. 뷰를 업데이트 하는 사이클은 메인 런루프에서 발생한다고 볼 수 있다. 메인 런루프는 3.5ghz로 1초에 35억번의 일을 처리한다. 마지막..