Swift(12)
-
복잡한 JSON 디코딩하기 - NestedContainer, custom init
1. 복잡한 JSON Model이전에는 quick.io에서 무지성 JSON 복붙으로 모델을 만들었는데, 디코딩 커스텀하는 좋은 예시가 있어서 공유해본다.위의 GeoJSON은 type, metadata, features, bbox라는 4개의 키를 가진 JSON 모델이다. 각각의 키값은 단일 값일 수도, 배열일 수도, 다른 오브젝트를 자식으로 가질 수 있다.우리는 earthquake만을 필요하기 때문에 전체를 디코딩하기 보다는 features 키안의 필요한 값만 디코딩해볼 것이다.Keyed Contaienr and UnKeyed ConatinerContainer는 Keyed 또는 UnKeyd이다. 일반적으로 우리가 써왔던 유일한 값들은 Keyed이다. 반면, UnKeyed는 unnamed element로,..
2024.09.17 -
WebRTC 앱 만들어보기: (1) Domain 지식
등장 배경WebSocket(Web Real Time Communication)은 서버의 중개를 거쳐 통신을 한다. 따라서, Client가 늘어나고, 프레임의 크기가 커질 수록 서버의 부담이 늘어난다.이를 해결하기 위해 등장한 것이 WebRTC이다. P2P로 연결되게 때문에 서버의 부담이 적다. 데이터 송수신에서는 UDP가 이용된다.Signaling두 클라이언트가 1)무엇으로, 2)어떻게 대화할지 서버를 통해 합의하는 과정.IP, 미디어 유형, 코덱 등을 초기화하는 과정Signalling 서버는 양방향 통신이 필요하기 때문에 WebSocket 구현이 일반적임이 시리즈에서는 FireStore를 이용하여 개발해볼 예정SDP(Session Definition Protocol)무엇으로 통신할지: 비디오, 오디오 ..
2024.09.08 -
WWDC2019 - Advances in Networking, Part 1
주요 내용 요약 Low Data Mode Combine in URLSession WebSocket URLSession and Network framework Network mobility Network 프레임워크와 URLSession 2가지 2track으로 진행한다.모티브사이드 프로젝트 채팅 기능에서 WebSocket을 사용하는데, StartScream 대신 직접 구현해보고자 서칭하다가 보게 됨. URLSession 기반 WebSocketTask를 중점적으로 봄. Low Data Mode 비용이 많이 드는 expensive mode인 cellular이거나 혼잡한 Wifi 환경일 때 LowData Mode라고 한다. Always save network data when there is no impact o..
2024.01.24 -
Memory Leak
Coorinator 패턴을 적용 후, Memory Leak이 있는지 없는지 체크해 보았다. 시나리오는 MainCoordinator(TabBar)가 제거 후, Login flow를 탈 때 TabBar가 가지고 있던 VC들에 대해 체크 1. 첫번째 탭의 첫번쨰 VC에서 RX.debug() 해 놓을 것들이 dispose메세지가 뜨지 않았다. 해서 deinit 안에 로그를 찍어보았는데, deinit 로그가 찍히지 않음. 2. instrument에서 Leak을 이용하여 체크 시도 Leak이 없다고 나온다!!? 하지만 Dispose도 되지 않고, deinit 로그도 찍히지 않았음 3. Rx 때문에 Leak이 나는지 child Coordinator 해제 시 Leak이 나는지 체크 기존 Leak이 나던 첫번째 VC 앞..
2023.10.31 -
동영상 피드 스크롤 시 중앙의 비디오만 재생되는 기능
유튜브, 인스타, 트위터 등 앱들을 사용할 때는 몰랐는데 생각보다 셀에서 영상이 재생되는 예제를 찾기 힘들었다. 상태 관리가 힘들어서 그런 것 같다. 그러던 중 아래와 같은 요구 사항이 추가되었다 피드 리스트에서 스크롤 시 중앙에 있는 비디오만 재생해주세요 구현 아이디어 1 [참고1] 테이블 뷰의 center 좌표를 구하고 헤당 좌표에 있는 셀의 비디오를 재생 재생 상태 관리는 이전에 재생한 cell을 변수로 저장 func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { let point = self.convert(tableView.center, to: tableView) guard let ind..
2023.03.29 -
AVFoundation - 비디오의 인코딩(압축) 및 업로드(3) - 업로드 개선
짧은 비디오가 아니라 20분가까이 되는 비디오이다 보니 압축과 업로드에 유저가 불편함을 느낄 정도로 시간이 많이 소요된다. 해서 업로드 부분을 탭바가 책임지도록 변경했다. 피드 업로드에서 비디오와 제목/컨텐트 등의 데이터로 피드DTO로 가공하여 탭바-뷰모델로 넘겼다. 이 과정에서 2가지 에러가 발생했다. 하나는 AssetReader 참조 에러 이 과정에서 ARC에 의해 assetReader가 먼저 Release되는 에러가 발생했다. cannot copy next sample buffer before adding this output to an instance of AVAssetReader 나머지 하나는 Memory Crash 용량이 큰 비디오에서 메모리 때문에 앱이 튕기는 현상이 발견되었다. 전에도 해당..
2023.03.21