현업에선 RxSwift를 사용하고 있다. 그중 가장 많이 보이는건 .rx 이 친구.. 도대체 뭘까? Button.rx TextField.rx 이런건 봤는데 따로 커스텀해서 만들어져있는걸 보고 공부해야겠다 안되겠다..하고 미루고 미루던게 드디어 오늘이다. 한번 파보자 !! .rx Observable 타입을 표현하는 확장자로, 비동기적으로 데이터를 생성하고나 다른 이벤트를 전달 하는 시퀀스 인데 기본형태로는 아래와 같이 쓰입니다. extension Reactive where Base: SomeType { } 가장 끝 SomeType 쪽에 (UIButton, UITextField, URLSession 등) 감지하고 싶은 특정 reactive extension을 구현합니다. 예시) self.someButton ..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bzR4RL/btr1f15mVnV/LfZfiYuli1cNpCVihL9TYK/img.png)
지금까지 Combine 내용에선 무조건 성공하는 케이스만 다뤄봤는데, 이번엔 실패했을경우 에러 처리를 어떻게 해야하는지, 어떤 에러처리 방법이 있는지 다뤄보도록 하겠습니다. Never Failure 타입이 Never인 publisher는 erorr가 없는 경우 입니다. example(of: "Never sink") { Just("Hello") .sink(receiveValue: { print($0) }) .store(in: &subscriptions) } Just의 경우 내부를 보면 Failure = Never인걸 확인할 수 있습니다. 만약 Never 타입에서 동작하는 operator(연산자)는 몇개 더 있습니다. 대표적으로 많이 쓰는 `setFailureType`을 먼저 봅시다. setFailureT..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/kwMB4/btrZJcnMu2j/M9V2WrmmKcCf1Fujlb0pDK/img.png)
재직중인 회사 서비스의 주요개발은 카메라와 WebRTC인데, 이번 프로젝트를 통해 카메라 쪽을 구현하면서 공부했던걸 정리해보고자 기록을 남겨봅니다. AVCaptureSession 사진 또는 비디오를 이용하기 전에 아래와 같은 설정을 하는 class 입니다. 즉, input과 output을 연결시켜주는 중개자 의 느낌! 카메라 기능을 구현하려면 아래의 3단계 세팅이 필요합니다. 입력 장치(input device) 출력 미디어(output media) preview views 위 그림을 보고 흐름을 예를 들어 표현해보자면 아래처럼 표현할 수 있어요. * input은 빨간글씨, output은 파란글씨로 적겠습니다. A: 카메라 (후면) 광각 렌즈를 써서 동영상을 찍을건데 소리도 녹화 됐음 좋겠어. 녹화된 영상..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bccyz2/btrWCzTPjqL/jpqMTF92zC4kC5eK73oWCK/img.png)
share() 값(value)으로 보다는 참조(reference)로 publisher를 공유할 수 있게 해줍니다. 즉, share() 메서드는 일반적으로 struct로 되어있는 Publisher를 reference타입으로 반환해줌! subscriber는 구독후에 upstream publisher가 방출하는 값을 받게됩니다. subscriber가 upstream publisher가 완료된 공유 publisher를 구독하면, 해당 subscriber는 완료 이벤트(completion event)만 받습니다. import Combine import Foundation let shared = URLSession.shared .dataTaskPublisher(for: URL(string: "https://www...
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/boJMer/btrWfQHuetu/UY8Bk6rUUAUNbeT3KWt4u0/img.png)
Key-Value Observing publisher(for:) 단일 변수의 변화를 관찰하려면? KVO(Key-Value Observing)를 준수하는 객체의 모든 속성에 대한 게시자를 제공합니다. ObservableObject 프로토콜은 여러 변수가 변경될 수 있는 경우를 처리합니다. KVO는 Objective-C의 필수 구성 요소였고, Foundation, UIKit 및 AppKit 클래스 대부분의 프로퍼티는 KVO를 준수합니다. 따라서, KVO를 사용하여 변화를 관찰할 수 있습니다. KVO를 준수하는 프로퍼티를 관찰하는 방법 (OperationQueue를 이용) import Combine import Foundation let queue = OperationQueue() let subscriptio..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b5YKmp/btrVE2nutSd/u9xuuNCmjBPeiU6JaI7Ckk/img.png)
Timers 타이머를 구현하려면 아래와 같은 방법이 있습니다. RunLoop Timer class DispatchQueue RunLoop NOTE Apple 공식문서에서 RunLoop 클래스는 thread safe 하지 않아, 현재 thread에서만 RunLoop 메서드를 호출해야 한다고 합니다. 아래는 RunLoop를 활용해 1초마다 print를 하는 timer를 만든 예제 입니다. import Foundation let runLoop = RunLoop.main let subscription = runLoop.schedule( after: runLoop.now, interval: .seconds(1), tolerance: .milliseconds(100)) { print("Timer fired") }..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/c0VWhL/btrU56SSjdg/wBRWkAcJeCXQ75sxDKMaW0/img.png)
Printing events print(_:to:) 디버깅을 할때 print(_:to:) 메서드로 chain메서드 중간중간 상황을 파악할 수 있습니다. import Combine import Foundation let subscription = (1...3).publisher .print("publisher") .sink { _ in } // 1 //publisher: receive subscription: (1...3) // 2 //publisher: request unlimited // 3 //publisher: receive value: (1) //publisher: receive value: (2) //publisher: receive value: (3) // 4 //publisher: recei..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/ZJkaS/btrTANzAV2k/0IyZfwJowkNoBR3oj2qUrk/img.png)
요즘 Camera 작업을 하면서 Layer와 View가 많이 보여 둘의 차이점이 궁금해졌다. 검색을 해보다가 간단하게 잘 정리 되어있는곳을 참고하여 글을 작성해보려고 한다. UIView, CALayer 무슨차이? Layer는 low-level의 인터페이스를 제공합니다. 즉, UIView에서 조절할 수 없는 부분을 Layer를 통해 할 수 있다는거죠. 아래 그림을 보면 이해가 좀더 잘될 겁니다. UIView View는 더 복잡한 hierarchy (뷰계층)을 갖고 있습니다. 레이아웃을 배치하기 위해 오토레이아웃(AutoLayout)을 사용합니다. UIView 작업은 main Thread에서 발생하며, CPU를 사용합니다. CALayer UIView 보다 hierarchy (뷰계층)가 간단하며, 화면에 그리..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/lUzix/btrVamGWF1d/7gEhEXDD01F2SFeZ5UMFN1/img.png)
Shifting time publisher에서 방출하는 이벤트를 지연시키는 연산자를 알아보겠습니다. delay(for:tolerance:scheduler:options) upstream 에서 값을 방출할 때마다 잠시 동안 지연시켜 다음 지정한 스케줄러에서 방출합니다. import Combine import SwiftUI import PlaygroundSupport // 1 let valuesPerSecond = 1.0 let delayInSeconds = 1.5 // 2 let sourcePublisher = PassthroughSubject() // 3 let delayedPublisher = sourcePublisher.delay(for: .seconds(delayInSeconds), schedule..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/blrUm4/btrQTFk5qvI/WXjWdzj4m0Eq2kwA7PP560/img.png)
https://school.programmers.co.kr/learn/courses/30/lessons/12917 문제 사진 내 풀이 func solution(_ s:String) -> String { return String(s.sorted(by: >)) } solution("Zbcdefg") // gfedcbZ 처음 생각했던 방법은 filter() 메서드를 사용하여 isLowercase, isUppercase 로 소문자, 대문자를 걸러서 sorted() 를 사용해 마지막으로 합칠 생각이었으나... sorted(by: >) 내림차순으로 정리하면 소문자(z ~ a) → 대문자 (Z ~ A) 순으로 알아서 정리를 해줬다.. 나름 머리를 굴렸지만 메서드 하나로 해결되는거에 신기하면서도 허탈했다 🌝
- Total
- Today
- Yesterday
- swift protocol
- Swift Error Handling
- Swift ModernRIBs
- swift programmers
- Swift inout
- Swift
- removeLast()
- Swift final
- CS 네트워크
- RIBs tutorial
- Swift Leetcode
- ios
- 원티드 프리온보딩
- swift 고차함수
- Swift RIBs
- Swift joined()
- iOS error
- Swift 내림차순
- Swift 프로퍼티
- Class
- RTCCameraVideoCapturer
- swift property
- Swift 프로그래머스
- Swift 알고리즘
- 2023년 회고
- swift (programmers)
- Swift init
- Combine: Asynchronous Programming with Swift
- swift reduce
- Swift joined
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |