분류 전체보기
-
Rxswift Observable 타이머: 서버 시간 동기화 (디바이스 시간 문제)개발/Swift 2025. 7. 22. 16:11
Rxswift Observable 타이머: 서버 시간 동기화 이 글에서는 Swift에서 타이머를 구현할 때 발생할 수 있는 문제점들을 파악하고, 이를 **신뢰할 수 있는 형태로 개선하는 방법**에 대해 다룹니다. 타이머 기본 구현 (디바이스 시간 기준) 우선, 현재 시간을 기준으로 남은 시간을 초로 계산하여 타이머를 구현하는 기본적인 코드입니다. 이 방식은 타이머가 언제 호출되든 문제가 발생하지 않는 것처럼 보입니다. func startTimer(endTime: Date) -> Observable { var remainingSeconds = Int(endTime.timeIntervalSinceNow) // 남은 시간을 초로 Int..
-
ReactorKit transform 중복 호출 문제 해결 Cold Observable 사용 주의점 (.share())개발/Swift 2025. 7. 15. 16:08
ReactorKit transform 중복 호출 문제 완벽 해결 가이드 (.share()) ReactorKit에서 transform(mutation:)은 Mutation 스트림을 변형할 수 있는 강력한 기능입니다. 하지만 Cold Observable의 특성을 이해하지 못하고 사용하면 모든 액션이 두 번씩 처리되는 심각한 버그를 마주할 수 있습니다. 이 글에서는 문제의 원인과 .share()를 이용한 명쾌한 해결법을 알아봅니다. 문제 상황: 모든 액션이 두 번씩 처리되다 특정 Mutation(setAlternateTooltipMessages)을 다른 Mutation(setTooltipMessage) 스트림으로 변환 후,..
-
UILabel에 HTML 적용하는 법: NSAttributedString 변환 및 스타일 적용개발/Swift 2025. 7. 11. 15:27
UILabel에 HTML 적용하는 법: NSAttributedString 변환 및 스타일 적용요구조건에 의해 HTML 태그를 UILabel에 적용해야 했습니다.이를 위해서는 HTML String을 NSAttributedString으로 변환해야 합니다.1. HTML을 NSAttributedString으로 변환하는 코드// ***htmlText : String***guard let data = ***htmlText***.data(using: .utf8) else { return nil}let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [ .documentType: NSAttributedString.DocumentType.html,..
-
RxSwift: Observable.interval 타이머, 재구독 문제: 기존 구독 끊기개발/Swift 2025. 7. 3. 09:38
RxSwift: Observable.interval 문제 해결 및 동적 메시지 업데이트 가이드Observable.interval은 RxSwift에서 타이머 기능을 간단하게 구현할 수 있는 강력한 오퍼레이터입니다 [1].예를 들어, 다음과 같이 startTimer 함수를 사용하여 특정 종료 시간까지 1초마다 남은 시간을 업데이트하는 타이머를 만들 수 있습니다 [1].func startTimer(endTime: Date) -> Observable { let timer = Observable.interval(.seconds(1), scheduler: MainScheduler.instance).startWith(0) return timer.map { _ in formatRemainingTime(end..
-
SwiftUI TCA 파일 첨부 - 문서 파일 업로드, 다운로드, 저장 기능개발/Swift 2025. 6. 20. 09:36
https://inf.run/iDaq4 SwiftUI + TCA: 실전 프로젝트로 완성하는 차세대 iOS 아키텍처 강의 | 덤벨로퍼 - 인프런덤벨로퍼 | 복잡한 SwiftUI 상태 관리, TCA (The Composable Architecture)로 깔끔하고 견고한 앱을 만드세요. 실전 프로젝트 예제로 핵심만 빠르게 배웁니다. , SwiftUI + TCA: 실전 프로젝트로 완성하는 차세대www.inflearn.com SwiftUI TCA 파일 첨부 - 업로드, 다운로드, 저장 기능이 글에서는 SwiftUI TCA 환경에서 파일 첨부 및 관리 기능을 구현하는 포괄적인 방법을 설명합니다. 사용자 친화적인 파일 첨부부터 서버 통신, 그리고 기기 내 저장까지 모든 과정을 상세히 다룹니다.1. 파일 불러오기 (I..
-
SwiftData 기본 사용법 Model, ModelContext, Query개발/Swift 2025. 5. 8. 09:03
이번 글에서는 SwiftData의 핵심 요소인 Model, ModelContext, Query의 기본 사용법을 자세히 다룹니다. SwiftData를 활용하여 효율적인 데이터 관리를 시작해 보세요! -------------------------------------------------------------------------------- 엔티티 정의 (Model) SwiftData에서 데이터를 저장하기 위해서는 먼저 엔티티를 정의해야 합니다. @Model 매크로를 사용하여 쉽게 데이터 모델을 생성할 수 있습니다. Identifiable 프로토콜을 채택하는 것이 일반적입니다.@Model final class User: Identifiable { var name: String var email..
-
SwiftUI TextEditor 자동 스크롤 버그 오류 해결 (커서 문제)개발/Swift 2025. 4. 18. 17:20
💬 문제 상황: 내 마음대로 움직이는 스크롤앱에서 긴 글을 작성하거나 수정하는 기능을 만들 때, 우리는 보통 TextEditor를 사용하고 내용이 길어지면 당연히 ScrollView로 감싸줍니다. 하지만 바로 이 지점에서 문제가 발생합니다.어떤 문제인가요?TextEditor에 텍스트가 화면을 넘어갈 정도로 길어집니다.수정을 위해 TextEditor의 윗부분을 터치(focus)합니다.분명히 위쪽을 터치했는데, 스크롤이 제멋대로 맨 아래로 쭉 내려가 버립니다.또 텍스트 입력시 스크롤이 되돌아 가지도 않고마지막줄 줄 넘김에도 스크롤이 커서를 따라가지 않는 문제도 있음아래는 바로 그 문제의 상황을 재현한 코드입니다.// MARK: 문제가 발생하는 코드struct ContentView: View { ..
-
SwiftUI TextEditor 오류 - 긴 text 내용이 minHeight에 잘리는 문제 (onAppear, task)개발/Swift 2025. 4. 18. 17:10
의도한 동작은 최소 160의 높이를 가지고 내용이 길수록 TextEditor도 늘어나야 함 TextEditor(text: $store.content.sending(\\.setContent)) .focused($focusedField, equals: .content) .frame(minHeight: 160) .font(.system(size: 16)) .padding(.top, 16)내용을 처음부터 입력 할떄는 정상 동작하지만처음부터 content 가 길 경우 160 높이 에서 잘림, 입력하면 동적으로 늘어남 OnAppear 이후에 컨텐츠 갱신..