본문 바로가기

iOS

(87)
UI업데이트를 메인스레드에서 해야하는 이유 with 데드락 문제 ㅇㅅㅇ 카테고리를 선택해서 필터링 된 리스트를 보여주는 화면에서 문제가 발생했다. 1. 앱이 튕기거나 2. 화면이 멈춰서 아무런 동작을 할 수 없었다. (앱은 돌아가지만 화면 터치가 막힌 상태) 자세히 살펴보면 데드락이 발생했고, outstanding async updates (비동기적으로 업데이트가 발생한 상태에서 해당 업데이트가 완료되기 전에 다른 업데이트가 추가로 발생하는 것) 가 있는 메인큐에서 이 메서드를 호출하는 것은 허용되지 않는다고 한다. 문제가 됐던 코드 원인이 되는 코드를 찾아 스레드를 거슬러 올라가보니 컬렉션 뷰의 데이터를 업데이트하는 코드를 찾을 수 있었다. 이 문제가 되는 코드를 빠르게 찾을 수 없었던 이유가.. 어째서인지 문제 발생한 코드는 단순히 subscribe를 하고 ..
Figma-export로 color, icon, image, typography를 자동으로 export 해보기 결론부터 말하자면 다 하고보니 피그마 유료버전만 사용 가능해서 결국은 사용하지 못했지만.. 추후에 다시 사용할 때를 대비하여 멤모멤모 Figma color 일일이 asset 추가 + SwiftGen 지난 프로젝트에서 Figma로 디자인 시스템을 간단히 만들고 asset에 추가했는데 이때 color picker로 light, dark 모드 컬러를 하나하나 찍으면서 추가했어서 정말 오래걸리고 부정적인 경험이었다ㅠ 가끔 멍때리다가 잘못 찍으면 이렇게 추가하고는 SwiftGen 이라는 오픈소스를 사용해서 assets에 있는 컬러들을 자동으로 코드로 변환해주도록 사용했었다. https://github.com/SwiftGen/SwiftGen 이 부분에선 자동으로 생성해주니 편안했는데 color를 추가하거나 변경할때..
[두깃] 1.0.1 업데이트 하면서 배운 것 다시 취준을 하게되었고 두깃을 쓰면서 위젯 기능도 추가해보고 싶어 간단하게 업데이트를 하기로 했다. 오랜만에 코드를 보았는데 컨벤션이 엉망이었다. 나름 컨벤션을 지키면서 코드를 짰다고 생각했는데 버캠 팀원들이랑 컨벤션을 꼼꼼하게 정하고 다시 보니 도대체 무슨 기준으로 코드를 짰던 거지 일단 보이는 부분만 수정하니 모든 파일을 수정하는 대작업을 할 수 있었다.. 버저닝 출시 직후는 1.0 버전인데 이후에는 어떻게 버저닝을 할지 찾아보았다. major.minor.etc major : 호환이 안되는 변경, 프레임워크 변경, 함수 삭제, 이름 변경 등 구조 자체가 변화하는 커다란 변경사항이 있을 때 minor : 호환이 가능한 변경, 기능 추가, 컴포넌트 추가, 클래스 추가, 함수 추가 등 변경사항이 추가될 때..
[burstcamp] Remote PushNotification 도입 2편 - 어디서나 푸시알림 받아서 디테일 화면 띄우기 https://luen.tistory.com/211 [burstcamp] 백엔드 개발자 없이.. Remote PushNotification 도입 1편 - Firebase Functions 푸시알림 왜 썼나? burstcamp는 캠퍼들의 블로그 글들을 모아서 보여주는 앱인데, 앱을 들어오지 않고도 글을 추천해서 보여줄 수 있도록 푸시알림을 도입하게 되었습니다. 어떤 푸시알림? 로컬에 luen.tistory.com 1편에서 푸시알림을 보내고 이제 앱에서 푸시알림을 받을 수 있게 되었습니다! 앱에서 처리해야 할 일은 이제 푸시알림을 탭했을 때 디테일화면을 띄워주는 일이 남았네요. 두가지의 경우를 처리해줘야 합니다. - 백그라운드에서 알림을 받았을 때 - 포그라운드에서 알림을 받았을 때 백그라운드와 포그라운드에..
[burstcamp] 백엔드 개발자 없이.. Remote PushNotification 도입 1편 - Firebase Functions 푸시알림 왜 썼나? burstcamp는 캠퍼들의 블로그 글들을 모아서 보여주는 앱인데, 앱을 들어오지 않고도 글을 추천해서 보여줄 수 있도록 푸시알림을 도입하게 되었습니다. 어떤 푸시알림? 로컬에서 보낼까, 서버에서 보낼까 캠퍼들에게 하루에 한 번 12시 16분에 최신 글을 추천해주는 푸시알림을 도입하기로 했기 때문에 로컬에서 보내는 푸시알림은 사용할 수 없었고, RSS 피드를 긁어오기 위해 Firebase Functions를 사용하고 있었기 때문에 Firebase Functions를 사용하여 푸시알림을 보내기로 하였습니다. 앱에 푸시알림을 추가하자 저희는 p8 방식을 사용하여 파이어베이스에 등록하였습니다. 과정은 참조글에 있는 글을 참조하였습니다. 더보기 참조 글 https://gyuios.tistor..
[burstcamp] 이미지 캐시 개선하기 (NSCache Limit, DownSampling) 처음 Image Cache를 구현했을 때 사용한 방식은 다음과 같습니다. 프로필 사진의 경우 1. memory cache (NSCache) 2. disk cache (File Manager) 3. Network 요청 후 memory, disk cache 저장 피드 이미지의 경우 1. memory cache (NSCache) 2. Network 요청 후 memory, disk cache 저장 개선점 1. NSCache Limit NSCache는 메모리를 많이 사용할 때 자동삭제 정책을 지원하지만, limit을 지정해주지 않으면 다 쓸 때까지 써버리는? 문제가 있었습니다. 위의 사진처럼 사용하면 할수록 올라가는 메모리.. var countLimit: Int var totalCostLimit: Int 최대 몇..
[iOS] NSCache https://developer.apple.com/documentation/foundation/nscache Apple Developer Documentation developer.apple.com NSCache A mutable collection you user to temporarily store transient key-value pairs that are subject to eviction when resources are low. 리소스가 부족할 때 제거될 수 있는 임시 key-value 쌍을 저장하는 데 사용하는 변경 가능한 컬렉션입니다. = 임시 캐시 공간..! class NSCache : NSObject where KeyType : AnyObject, ObjectType : AnyObje..
[burstcamp] 유저정보를 효율적으로 관리하는 방법 (with. 파이어베이스, KeyChain) 생각을 정리한 글입니다. 팩트가 아닐 수도 있습니다. 유저 정보는 모든 화면에서 쓰이고, 자주 업데이트가 되는 모델입니다. 이 유저 정보를 어떻게 모든 화면에서 접근하고 효율적으로 저장할지 생각의 과정을 적어보겠습니다. 첫번째 만약에 유저 정보가 필요한 곳에서 필요할 때마다 DB에서 유저정보를 호출을 하게된다면? 저희는 Firestore에 유저 정보를 저장하고 업데이트를 하고있습니다. 필요한 곳마다 유저 정보를 호출하면 같은 유저 정보를 받는데 비용이 큰 네트워크 요청이 정말 많아질 것입니다. 같은 유저 정보를 저장한다는 의미에 초점을 두면 한번만 불러와서 여러 화면에서 유저정보를 사용하면 될 것이라는 생각이 들었습니다. 두번째 싱글톤에 유저 정보를 저장하고 앱 시작할 때 Firestore에서 유저 정보..