일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
31 |
- 프로그래머스
- Python3
- 인프런오리지널
- 리프2기
- IOS
- 스위프트
- 인프런강의
- 인프런파이썬강의
- 인프런파이썬
- swift
- 유학토플
- 노드JS
- 카카오톡채팅봇
- 파이썬
- nodeJS
- 토플
- 교환학생토플
- JS
- 토플공부수기
- 파이썬중급
- 파이썬웹크롤링
- uikit
- 자바스크립트
- 파이썬중급강의
- IOS프로그래밍
- SwiftUI
- 웹크롤링
- rxswift
- 인프런
- 우리를위한프로그래밍
- Today
- Total
목록swift (36)
먹고 기도하고 코딩하라
라이트/다크 모드 컬러가 다른 다이나믹 컬러를 사용할 때, 다크 모드에서도 뷰를 라이트모드 색상으로 표현하고 싶다면 보통은 뷰컨이나 뷰의 overrideUserIntefaceStyle을 .light로 고정해주면 된다. if #available(iOS 13.0, *) { self.overrideUserInterfaceStyle = .light } 하지만 완전한 해결이 되지는 않는다. 현상 특정 뷰의 borderColor, 그리고 backgroundColor 등을 동적으로 변경할 때, 색상이 다크 모드 색상을 그대로 따라가는 경우가 있다. 이런 경우 rgb 값을 명시적으로 넣어 라이트/다크모드에서의 색상을 모두 라이트로 통일하는 것을 한 가지 방법으로 사용할 수 있다. 하지만 추후에 다크 모드 지원을 염두에..
저번 달에 진행했던 Realm과 멀티 스레딩 세미나 자료를 블로그에도 올린다. 목차 Realm과 멀티 스레딩 Realm 마이그레이션 try? Realm()을 하면 한 스레드에 Realm이 여러 개 생기는 거 아닙니까 Realm과 멀티 스레딩 전제 경험으로 알고 있듯 Realm 객체는 다른 스레드에서 사용할 수 없습니다. You cannot share realm instances across threads. 원인 다른 스레드에서 접근 대상 : Realm 객체 자체 / Live Object Realm accessed from incorrect thread (RLMException) 에러와 함께 가차없이 강종됩니다. 싱글턴으로 사용하는 Realm 객체가 메인 스레드에 선언되어 있기 때문에, 다른 스레드에서 R..
회사에서 사용하는 따로 통신 객체가 있다. 통신을 시도할 때마다 이 클래스의 객체를 생성하면, 생성 이후에 바로 네트워크 통신이 이뤄진다. 처음 입사했을 때 통신 처리 코드가 너무 복잡하고 어렵다고 생각했지만, 1년이 지나 다시 살펴보니 흐름을 쭉 따라갈 수 있었다. 테스트 코드 연습을 위해 통신 로직에 대한 테스트 코드를 짜고자 결심했다. 막상 테스트 코드를 짜려고 하니 다음과 같은 문제가 있었다. init 말미에 통신 요청 코드가 포함되어 있다. 즉, 생성과 요청이 분리되어 있지 않다. Rx 방식을 사용하지 않기에, 응답 데이터를 컴플리션 핸들러로 받게 된다. 또한 연습용 테스트 코드이기에 기존 코드 변경을 최소화하면서 테스트 코드를 짤 수 있도록 기반을 마련해야 했다. 이런 상황이라면 회사에서 사용..
지난달에 ReactorKit 사내 세미나를 열었다. ReactorKit에 대해 간단히 설명하고, 프로젝트 일부 코드를 ReactorKit으로 부분적으로 전환했을 때 얻을 수 있는 장점 등을 설명한 다음, 회사 코드 일부를 ReactorKit으로 바꿔서 시연했다. 세미나가 끝나고 2가지 질문이 나왔다: mutate에서 통신 값으로 Observable을 return하게 하려면 기존에 쓰던 클로저 방식으로는 안 되는 건가? 즉, Observable을 반환하는 새로운 통신 함수를 작성하는 게 필수인가? 클로저로 값을 넘겨주는 건 안 되는 건가? 통신 중에 Reactor와 연동된 View가 사라지면 통신 옵저버블은 어떻게 되는가? 메모리 릭의 원인이 될 수 있지 않은가? 첫 번째는 일단 클로저 방식으로는 하기 어..
결론부터 얘기하면 있다. ReactorKit의 Reactor 파일을 살펴보면 extension에서 disposeBag을 찾을 수 있다. extension Reactor { fileprivate var disposeBag: DisposeBag { return MapTables.disposeBag.value(forKey: self, default: DisposeBag()) } } 하지만 fileprivate 레벨로 선언된 변수이기 때문에 커스텀해서 만드는 Reactor 내에서 직접 접근할 수는 없다. disposeBag의 존재 의의가 궁금해진다. 기원을 찾아 올라가기 위해 MapTables.disposeBag으로 이동한다. MapTables는 enum 타입이고, disposeBag 변수가 포함되어 있다. p..
한 줄 요약 iOS 17 이상에서 UIGraphicsBeginImageContext()를 시도할 때, 이미지 사이즈가 (0, 0)인 경우 강제종료될 수 있으므로 UIGraphicsImageRenderer를 쓰는 것이 권장된다. 메이저 앱 배포 후 갑자기 ImageContext 관련해서 크래시리틱스에 이슈가 많이 나왔다. **NSInternalInconsistencyException - UIGraphicsBeginImageContext() failed to allocate CGBitampContext: size={0, 0}, scale=1.000000, bitmapInfo=. Use UIGraphicsImageRenderer to avoid this assert.** 이런 에러 메시지가 포함되어 있었는데,..
iOS 17에서 기존과 같이 위젯을 만들었을 때, 크게 2가지 문제점이 있다. 위젯 위아래의 마진으로 레이아웃 깨짐 디버그 모드에서 설치 안됨 1. 위젯 위아래의 마진으로 레이아웃 깨짐 대응을 하지 않은 경우, iOS 17에서의 위젯은 위아래로 마진이 생긴다. 그래서 기존에 설정해둔 레이아웃이 깨지게 된다. 다행히 iOS 17 이상에서 이 마진을 무시할 수 있다. Widget의 body, WidgetConfiguration에서 다음과 같이 .contentMarginDisabled()를 적용해주면 마진을 무시하게 된다. var body: some WidgetConfiguration { let configuration = StaticConfiguration(kind: kind, provider: Provid..

노치 있는 status bar나 home indicator 부분까지 색상이 깔린 디자인을 받을 때가 종종 있다. 폰마다 status bar, home indicator 영역이 조금 다르다. 예를 들어, 홈 버튼이 있는 아이폰 SE 2, 3세대 등의 폰은 아예 home indicator 영역이 잡히지 않는다. 무조건 화면 아래에 constraint를 깔고 constant 34 주는 게 능사가 아닐 수 있다는 이야기다. 우선 status bar 배경색을 주는 방법부터 살펴보자. 2가지 방법이 있다. (1) statusBarManager 사용 첫 번째는 windowScene의 statusBarManager를 사용하는 것이다. UIApplication의 windows 중 첫 번째 window의 windowSce..