쑤야의 개발 블로그

고정 헤더 영역

글 제목

메뉴 레이어

쑤야의 개발 블로그

메뉴 리스트

  • 홈
  • 태그
  • 분류 전체보기 (98)
    • Algorithm (52)
    • CS (0)
    • AI (15)
      • PyTorch (4)
      • 논문 (3)
      • Open3D (7)
      • DL (0)
    • iOS (30)
      • RxSwift (4)
      • Combine (4)
      • Swift (1)
    • ETC (1)
      • 기타 (1)

검색 레이어

쑤야의 개발 블로그

검색 영역

컨텐츠 검색

iOS

  • throttle

    2024.02.29 by 쑤야.

  • 재사용 가능한 ViewModel 구현하기

    2024.02.18 by 쑤야.

  • 텍스트 필드 디자인 시스템 구현하기

    2024.01.07 by 쑤야.

  • 반복문 안의 작업들을 동시에 비동기로 처리하기

    2024.01.06 by 쑤야.

  • Combine은 withLatestFrom을 제공하지 않는다

    2023.12.25 by 쑤야.

  • Timer 사용해보기

    2023.12.24 by 쑤야.

  • Repository의 DTO → Entity 변환 과정 개선하기

    2023.12.23 by 쑤야.

  • 토스트 메시지 싱글톤으로 관리하기

    2023.12.19 by 쑤야.

throttle

https://developer.apple.com/documentation/combine/fail/throttle(for:scheduler:latest:) throttle(for:scheduler:latest:) | Apple Developer Documentation Publishes either the most-recent or first element published by the upstream publisher in the specified time interval. developer.apple.com RxSwift와 Combine을 사용하면서 throttle에 대해 들어보기는 했는데, 제대로 사용해 보거나 공부해 본 적이 없다. throttle에 대해 학습하고, 현재 진행 중인 프로젝트에도 적..

iOS/Combine 2024. 2. 29. 13:51

재사용 가능한 ViewModel 구현하기

상황 A/B 프로젝트에서 토픽 조회 API와 투표 API를 3개의 탭에서 사용한다. 각 ViewModel에 동일한 로직을 3번이나 구현하는 것은 번거로운 일이라고 생각했다. 이를 개선하기 위해서 한 번만 구현하고, 재사용할 수 있는 코드를 작성해야겠다는 생각을 하게 되었다. 개선 평소 책임 지향 설계를 위해 프로토콜로 ViewModel이 가지는 책임을 먼저 정의하고, 이후 구현체를 구현하는 방식으로 ViewModel을 구현한다. 또한 프로토콜 초기 구현 개념을 쏠쏠히 사용하고 있다. 평소 애용하던 프로토콜과 초기 구현을 활용하여 ViewModel을 구현하면 재사용성 가능한 ViewModel을 구현할 수 있겠다는 생각을 하게 되었다. 아이디어를 바탕으로 토픽 조회 ViewModel 프로토콜을 생성하고, 초..

iOS 2024. 2. 18. 11:38

텍스트 필드 디자인 시스템 구현하기

A/B 프로젝트에서 사용되는 공통 텍스트 필드 아래와 같이 3가지 상태를 가진다. 아래 목표들을 최대한으로 충족시킬 수 있는 디자인 시스템을 구현하고자 했다. 상태에 따라 변화하는 UI를 실수 발생이 최소화될 수 있으며, 유지 보수성이 높은 코드 설계 다른 디자인의 텍스트 필드가 등장하더라도, UI 속성 값 전달만으로 UI를 완성 평소 프로젝트에서 UIButton.Configuration와 UITableViewDelegate를 사용하면서 얻게 된 아이디어를 바탕으로 구현해 보았다. 1. 상태에 따라 변화하는/변화할 수 있는 속성 추출하기 상태 정의는 아래와 같이 3 가지로 구분하였다. editing 상태의 경우, 굳이 나눌 필요가 없을 수도 있지만, 혹시 모를 경우에 대비해서 분리하였다. 2. 상태 변화..

iOS 2024. 1. 7. 16:43

반복문 안의 작업들을 동시에 비동기로 처리하기

상황 A/B 프로젝트에서 토픽 생성 기능이 존재한다. 토픽은 선택지 A와 B를 가지고 있다. 선택지는 텍스트 타입 또는 이미지 타입으로 등록이 가능하다. 이미지 타입으로 토픽을 생성하기 위해서는, AWS에 프런트가 직접 이미지를 등록해야 한다. 과정은 아래와 같다 서버한테 presigned url 받기 presigned url로 이미지 업로드하기 업로드가 완료되면, 토픽 생성 API를 호출 1 번과 2 번의 과정은 PresignedImageRepository의 upload 메서드 안에서 모두 처리할 것이다. protocol PresignedImageRepository: Repository { func upload(bucket: ImageBucket, request: UIImage) async throws..

iOS 2024. 1. 6. 18:09

Combine은 withLatestFrom을 제공하지 않는다

RxSwift의 withLatestFrom RxSwift에서 withLatestFrom은 방출 기준이 되는 observable이 방출될 때마다 다른 observable의 최신 값을 가져와 결합한 후, observable을 방출한다. Combine은? Combine에서 다른 publisher들을 모아서 재방출할 수 있는 연산자로 zip, merge, combineLatest 3가지가 있는데 아쉽게도 withLatestFrom와 같은 기능을 수행하는 연산자는 없다. combineLatest가 최신 값을 가져와 방출하는 특징을 가지고 있다. 하지만 기준으로 설정한 publisher가 새로운 이벤트를 방출할 때에 대해서만 이벤트가 방출되는 것이 아니라, 기준에 상관없이 결합된 다른 publisher들이 새로운 ..

iOS/Combine 2023. 12. 25. 00:25

Timer 사용해보기

https://developer.apple.com/documentation/foundation/timer Docs Overview 타이머는 실행 루프와 함께 작동한다. 실행 루프는 타이머에 대한 강력한 참조를 유지하므로 타이머를 실행 루프에 추가한 후 타이머에 대한 강력한 참조를 유지할 필요가 없다. 타이머는 실시간 메커니즘이 아니다. 따라서 long run loop가 호출되거나, run loop가 타이머를 모니터링하지 않는 모드에서 타이머의 실행이 발생하게 될 경우, 다음 run loop 확인 전까지 타이머가 실행되지 않아 실제 시간과 오차가 발생할 수도 있다. Comparing Repeating and Nonrepeating Timers Timer 생성 시 반복인지, 비반복인지를 지정해줘야 한다. 비..

iOS 2023. 12. 24. 20:33

Repository의 DTO → Entity 변환 과정 개선하기

프로토콜 초기 구현을 통해 Repository에서 DTO를 Entity로 변환하는 코드를 개선한 과정을 기록한다. 문제 인식 아래 코드는 댓글 생성 API이다. 이 포스팅에서 집중적으로 다룰 곳은 노란색 박스로 표시한 부분이다. 박스 안에서는 API를 요청하고 결과를 반환한다. API 요청 결과인 dto와 error 프로퍼티에 대해 map operator를 사용해 도메인에서 사용하는 entity로 변환해 준다. 이렇게 API를 요청하고 모델을 변환하는 과정은 댓글 생성 API만 사용하는 것이 아니라, Repository 내의 모든 API 요청 메서드가 거쳐야 하는 작업이다. 나는 모든 메서드마다 작성해줘야 하는 최소 5줄의 중복 코드에 대해 불편함을 느꼈다. 또한 프로젝트에서 API 응답 결과로 빈 값이..

iOS 2023. 12. 23. 00:19

토스트 메시지 싱글톤으로 관리하기

A/B 프로젝트에서 알림 UI로 토스트 메시지를 사용한다. 문제를 해결해 나가는 과정에서 운영체제 개념들이 많이 생각났고, 고민이 꽤 많았었는데 요구사항을 충족해 나가는 과정, 그리고 문제 상황에서 고민하고 해결한 과정들을 기록해 본다. 요구사항 1. 토스트 메시지는 한 번에 하나씩만 보여준다. 한 번에 하나씩 처리하기 위해서, 싱글톤 인스턴스를 사용해야겠다는 생각을 가장 먼저 했다. 방법 1. semaphore → 실패 방법 2. 뮤텍스 → 성공 isAnimating을 임계 구역에 진입할 수 있는 키로 사용하였다. public final class ToastMessage { private init() { } private static var isAnimating = false private static..

iOS 2023. 12. 19. 23:39

추가 정보

인기글

최신글

페이징

이전
1 2 3 4
다음
TISTORY
쑤야의 개발 블로그 © Magazine Lab
페이스북 트위터 인스타그램 유투브 메일

티스토리툴바