일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- uikit
- 스위프트
- 인프런강의
- IOS프로그래밍
- 파이썬중급
- 토플공부수기
- 자바스크립트
- JS
- swift
- Python3
- 파이썬
- 토플
- 파이썬중급강의
- SwiftUI
- 노드JS
- IOS
- 파이썬웹크롤링
- 우리를위한프로그래밍
- nodeJS
- rxswift
- 리프2기
- 인프런
- 인프런파이썬강의
- 교환학생토플
- 웹크롤링
- 인프런오리지널
- 인프런파이썬
- 유학토플
- 프로그래머스
- 카카오톡채팅봇
- Today
- Total
목록전체 글 (137)
먹고 기도하고 코딩하라

작년 WWDC 23에서 Privacy Manifest 소개 영상이 발표됐다. 당초 2024년 4월 28일쯤까지로 예정되었던 privacy manifest 작성 강제가 5월 1일로 날짜가 픽스되면서 요즘 여기저기서 얘기가 나오고 있는 privacy manifest에 대해 알아보고, 어떻게 적용해야 리젝을 피할 수 있을지 알아보자. privacy manifest는 무엇인가? 문서에 따르면, 앱이나 써드파티 SDK에서 수집하는 데이터와 API 사용 등에 대한 사유를 기술한 파일이다. 왜 중요한가? 심사 리젝을 회피하기 위해서이다. privacy manifest 작성이 필요한 앱은 2024년 5월 1일 이후 manifest를 작성하지 않고 심사를 등록했을 때 이 사유로 리젝당할 수 있다. 이는 앱스토어에 앱 심..
무지 기본적인 것에 무지한 관계로.. 뷰를 업데이트하는 레이아웃 메소드를 살펴본다. 뷰 레이아웃이 어떻게 이뤄지는지 알기 위해서는 일단 런루프를 조금 알아보는 게 좋겠다. 런루프 swift에는 런루프(run loop)라는 게 있다. 런루프는 Event-driven 프로그래밍에서 사용된다. 조금 추상적인 개념이지만 어떤 이벤트를 대기하면서 스레드를 좀 놀려놨다가 이벤트가 생기면 스레드에게 그것을 처리하게끔 시키는 스레드 관리 시스템이라고 보면 이해가 쉬울 것 같다. (polling이 아니라 notification을 기다리는 느낌이랄까) 그리고 메인 스레드에서 실행되는 런루프를 메인 런루프라고 부른다. 메인 런루프가 하는 주된 일은 앱 라이프사이클 주기 동안 계속 사용자 이벤트를 대기하고, 이벤트가 발생하면..
작업할 때 옵저버블을 관찰하는 스케줄러를 다른 스케줄러로 돌릴 때가 있다. .subscribe의 onNext에서 UI 변경 작업을 해줘야 할 때 메인으로 바꿔준다든가 할 때는 거의 .observe(on:)을 사용하곤 했다. .subscribe(on:)과 확실한 차이점은 어떤 것이 있어서 .observe(on:)을 썼을까 하면, 명쾌하게 이야기하기 힘들었다. 자주 쓰는 것이 아니면 잊어버리다 보니 이번 기회에 정리하고자 한다. 빠른 정리 1. .subscribe(on:) : Observable이 생성되는 스케줄러 변경 2. .observe(on:) : Observable을 구독하는, ObserverType의 스케줄러 변경 .subscribe(on:) - 생성 스케줄러 변경 .subscribe(on:)은 O..
최근에 새로운 사이드 프로젝트와 겸해서 다른 작은 프로젝트를 만들었는데, 다 만들고 나니 아차 싶었던 게 꽤 많이 보인다. 이래서 프로젝트엔 완성이 없고 방망이 깎듯이 계속 다듬고 깎아나가야 하는 듯하다. 불과 며칠 전에 한 프로젝트인데도 다시 리뷰하는데 아쉽다. 가장 아쉬운 것은 중복 값을 담지 않는 시퀀스를 담는 것으로 Array를 사용한 것이다. 거기다가 검색하는 데에 .contains를 사용했으니, 시간복잡도는 O(n)이 무조건 나오게 된다. (Array 특성상 contains를 하면 타겟 값을 찾아낼 때까지 모든 요소와 비교하기 때문에) Set을 썼다면 좋았을 텐데, 그거 고치는 거 얼마 걸리지도 않는데... 싶어 아쉬워하다가 오늘은 즉흥적으로 Set contains 시간복잡도가 왜 O(1)인지..
라이트/다크 모드 컬러가 다른 다이나믹 컬러를 사용할 때, 다크 모드에서도 뷰를 라이트모드 색상으로 표현하고 싶다면 보통은 뷰컨이나 뷰의 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가 사라지면 통신 옵저버블은 어떻게 되는가? 메모리 릭의 원인이 될 수 있지 않은가? 첫 번째는 일단 클로저 방식으로는 하기 어..