MVI패턴을 이용하여 프로젝트를 진행하면서, 기존 MVVM-In/Out 패턴에서 사용하던 ViewModel 테스트 코드 작성 방식으로는 상태값을 검증하지 못하는 이슈가 발생했다. 기존 MVVM 패턴은 input과 그 input에 대한 상태값의 변경인 output을 받아 화면을 갱신하는 구조여서 output에 대한 검증만 하면 되었지만, MVI 패턴은 State를 UI가 의존하는 구조로 intent에 따라 State의 값이 변경되는 구조로, State가 어느 시점에 변경이 되고 종료되는지를 외부에서 알 수가 없다. 예를 하나 들어보자면 다음과 같이 ViewModel을 정의했다고 가정한다.struct ImageFeedState { var images: [IFImage] = [] var isLoad..
내가 담당하고 있는 앱(차량 블랙박스 앱)의 기능 중 라이브 스트리밍 기능이 있는데, 기존에는 AVPlayer를 이용하여 영상을 재생하고 있었다. 그런데 새로운 블랙박스 연동 작업을 하던 중 스트리밍이 재생되지 않았다(까만 화면만 나옴). 분명 재생 관련 코드는 건드리지 않았는데도 말이다. 처음에는 내 작업으로 인한 사이드 이펙트라고 생각해 관련 코드를 확인해 봤지만, 변경된 부분은 없었다. 그래서 기존에 지원되던 단말로 스트리밍을 시도해 보니 정상적으로 재생되는 것을 확인했다. 또한 AVPlayer에서 AVPlayerItem의 프로퍼티들(status, error 등)을 KVO로 디버깅해 봤으나, 별다른 로그도 출력되지 않았다. 그래서 선임 개발자께 해당 이슈를 정리해서 문의했고, 이전 블랙박스와 신규 ..
요즘 미국에서 미성년자 sns 규제가 본격화 되면서 구글과 apple에서도 관련 api를 발표했고, 26년 1월 1일부터 시행되는 SB2420으로 인해 미국 텍사스에서 서비스 하는 앱들은 법규를 준수하기 위해 이에 대한 대응이 필요하다고 한다. 참고로 해당 api들은 iOS 26.2 이상 버전부터만 사용 가능하다. 앱 사용자 나이 받아오기target -> Capability에서 Declared Age Range 추가 do { let result = try await AgeRangeService.shared.requestAgeRange(ageGates: 18, in: vc) switch result { case .declinedSharing: /..
https://www.acmicpc.net/problem/2579 계단의 점화식 문제.특정 계단에서 얻을 수 있는 점수는 다음과 같다.n-1, n 이렇게 연속적으로 접근n-2, n 이렇게 떨어져서 접근따라서 다음과 같은 점화식이 세워짐dp[i-3]+stair[i-1]+stait[i] (연속적으로 계단에 접근한 경우)dp[i-2]+stair[i] (비연속적으로 계단에 접근한 경우)import Foundationlet n = Int(readLine()!)!var stairtArr: [Int] = []for _ in 0..
https://www.acmicpc.net/problem/2805 이분 탐색을 이용하여 자르는 부분의 범위를 구하는 문제. import Foundationlet nm = readLine()!.split(separator: " ").map{Int($0)!}let treeArr = readLine()!.split(separator: " ").map{ Int($0)! }var start = 1var end = treeArr.max()!while start mid { count += tree-mid } } if count >= nm[1] { start = mid+1 } else { end = mid-1 }}print(end)