![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/rESq0/btr5Fapl5Ve/SdjQceTvG4NAZgF9keojNk/img.png)
회사에서 움직임 감지 기능구현을 하면서 두 가지 기능이 필요했다. 1. 영상 녹화/ 저장 2. 움직임 감지 일단 영상 녹화/저장은 참고해볼 자료가 많아서 리서치 하는데 오래 걸리진 않았지만.. 움직임 감지기능과 영상을 녹화,저장을 동시에 하는 구현을 하면서 겪었던 산전수전을 기록하고자 한다. 삽질시작 빨리 끝낼 수 있는것 부터 손보려고 했고, 영상 녹화/ 저장 으로 가장 많이 나왔던 키워드는 AVCaptureMovieFileOutput, PHPhotoLibrary 였다. 이전 Camera설정 - AVCaptureSession 에서 블로깅했듯, 어렵지 않게 영상 녹화/ 저장 부분을 구현할 수 있었다. 그런 다음 움직임 감지를 하기 위해 제가 여러가지 리서치를 해보며 추려낸 키워드는 AVCaptureVide..
현업에선 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/9rlir/btrXn7I3gnb/WFfbP4KOkvx9wiiucWquL1/img.png)
WebRTC 스터디 모임을 하면서 발표를 하는데 모르는 키워드들이 나와서 하나씩 정리해보려고 블로깅을 해봅니다. NAT (Network Address Translation) 라우터가 기기의 private IP 주소를 받아 public IP 주소를 기기에 할당하기 위해 사용됩니다. 왜? 아래 사진을 보면서 설명을 해보자면, 기기 마다 고유의 private IP를 가지고 있는데 위 그림에서 핸드폰(private IP: 192.168.1.1)을 예로들면 private IP 이기 때문에 외부에서 접근 할 수 없죠. 외부에서 접근할수 없는데 네트워크 연결을 어떻게 하나? 이때 사용하는게 NAT 입니다. 집에서 사용하는 공유기(public IP: 82.129.80.111)를 통해 핸드폰에서 네트워크 요청을 받으면 ..
![](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/cdSUEB/btrXonkyzAo/l8ZzefJcbJidtS5ZdQQQ10/img.png)
회사에서 사용하고 있는 WebRTC에 대한 개념을 공부하기 위해 블로깅 해봅니다. WebRTC ? Web RealTime Communication 의 약자로 플러그인 설치없이 실시간 소통(비디오, 오디오)이 가능하도록 만들어주는 기술입니다. WebRTC를 사용하는 서비스 Google Meet, Zoom 등 별다른 프로그램 설치없이도 실시간 소통을 할 수 있는것! 통신원리 일반적으로 P2P(Peer to Peer)를 사용하며, P2P란, 두개의 단말이 서로 1:1 통신을 한다는 뜻으로, 서버의 개념없이 동등한 노드들로 구성되어 데이터를 주고받는 형식으로 되어있습니다. RTCPeerConnection WebRTC 컴포넌트로, peer들간의 데이터를 안정적이고 효율적으로 통신하게 도와줍니다. 커넥션이 이루어지..
![](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/cG3M82/btrVgiqN1Yc/2TG6vdmWTZk6WUjhDP5qDk/img.png)
글또라는 커뮤니티를 알게 되고 나서 마침 지원하는 조건중 '삶의 지도' 라는 글을 쓰는게 있는데, 이번 기회에 자신을 돌아보는 글을 남겨 보려고 한다. 사람 만나는걸 즐겼던 호텔리어 고등학생까지 딱히 꿈이없었던 시기여서 대학을 선택할 즈음 '뭘 잘할 수 있을까' 내가 좋아하는걸 고민해봤던 시기였다. 떠올랐던건 사람들과 잘 어울리고, 새로운 사람을 만나는걸 좋아하며, 남 돕는걸 좋아했었고, 어렸을적 엄마 손잡고 따라갔던 호텔결혼식장에서 '이런호텔 경영하려면 어떻게 해야돼?' 라고 했던게 기억이 나 '호텔경영학과' 에 지원하게 되었다. 어떻게보면 아주 간단하게 생각했던것 같은데, 다행히도 서비스업 이라는 직종은 나에게 잘 맞았던것 같다. 하나만 빼고.. 고건 바로.. 영어, 걸림돌이자 디딤돌아무래도 호텔은 ..
- Total
- Today
- Yesterday
- swift programmers
- Swift inout
- Swift ModernRIBs
- ios
- Class
- removeLast()
- Swift 프로그래머스
- 원티드 프리온보딩
- Swift RIBs
- swift (programmers)
- Swift joined
- Swift joined()
- Swift 알고리즘
- Swift Leetcode
- Swift 프로퍼티
- swift protocol
- Swift 내림차순
- iOS error
- Combine: Asynchronous Programming with Swift
- RIBs tutorial
- swift reduce
- 2023년 회고
- CS 네트워크
- RTCCameraVideoCapturer
- Swift
- Swift init
- swift property
- swift 고차함수
- Swift final
- Swift Error Handling
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |