본문 바로가기

iOS/PROJECT

(24)
UI업데이트를 메인스레드에서 해야하는 이유 with 데드락 문제 ㅇㅅㅇ 카테고리를 선택해서 필터링 된 리스트를 보여주는 화면에서 문제가 발생했다. 1. 앱이 튕기거나 2. 화면이 멈춰서 아무런 동작을 할 수 없었다. (앱은 돌아가지만 화면 터치가 막힌 상태) 자세히 살펴보면 데드락이 발생했고, outstanding async updates (비동기적으로 업데이트가 발생한 상태에서 해당 업데이트가 완료되기 전에 다른 업데이트가 추가로 발생하는 것) 가 있는 메인큐에서 이 메서드를 호출하는 것은 허용되지 않는다고 한다. 문제가 됐던 코드 원인이 되는 코드를 찾아 스레드를 거슬러 올라가보니 컬렉션 뷰의 데이터를 업데이트하는 코드를 찾을 수 있었다. 이 문제가 되는 코드를 빠르게 찾을 수 없었던 이유가.. 어째서인지 문제 발생한 코드는 단순히 subscribe를 하고 ..
[두깃] 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 최대 몇..
[burstcamp] 유저정보를 효율적으로 관리하는 방법 (with. 파이어베이스, KeyChain) 생각을 정리한 글입니다. 팩트가 아닐 수도 있습니다. 유저 정보는 모든 화면에서 쓰이고, 자주 업데이트가 되는 모델입니다. 이 유저 정보를 어떻게 모든 화면에서 접근하고 효율적으로 저장할지 생각의 과정을 적어보겠습니다. 첫번째 만약에 유저 정보가 필요한 곳에서 필요할 때마다 DB에서 유저정보를 호출을 하게된다면? 저희는 Firestore에 유저 정보를 저장하고 업데이트를 하고있습니다. 필요한 곳마다 유저 정보를 호출하면 같은 유저 정보를 받는데 비용이 큰 네트워크 요청이 정말 많아질 것입니다. 같은 유저 정보를 저장한다는 의미에 초점을 두면 한번만 불러와서 여러 화면에서 유저정보를 사용하면 될 것이라는 생각이 들었습니다. 두번째 싱글톤에 유저 정보를 저장하고 앱 시작할 때 Firestore에서 유저 정보..
[burstcamp] 다크모드 Switch 버튼 제공 (+iOS 15 대응) 이전에 다크모드를 구현했을 때는 시스템 설정을 따라가도록 만들었기 때문에 Color Asset만 Darkmode 설정을 해주면 따로 코드 작업을 하지 않아도 다크모드를 구현할 수 있었습니다. 이번에는 Switch 버튼으로 다크모드를 직접 앱에서 설정할 수 있도록 구현해야하기 때문에 코드작업이 필요했습니다. (더불어,, 네비게이션바와 탭바도,,) 앱의 다크모드 설정 Flow는 다운로드시 Light, 후에는 사용자 설정으로 따라갔기 때문에 UserDefaults에 정보를 저장하기로 했습니다. UserDefaults에서 정보를 꺼내와서는 Appearance 라는 객체를 만들어 사용하였습니다. (light, dark) 다크모드 window 설정 스위치가 On/Off 될 때마다 window의 overrideUse..
[burstcamp] XCTemplate 팀에서 코드 템플릿을 만들어 사용하자는 의견이 있어서 Notion에 템플릿을 적어두고 구현할 때마다 복사해서 사용하기로 했었습니다. 템플릿에는 ViewController에서 구현해야하는 required init, loadView, viewDidLoad, configureUI, bind, MARK 주석 등을 적어두었습니다. 그러던 도중 XCTemplate 라는 것을 처음 딜라이트룸의 벨로그 글을 보고 알게되었습니다. https://medium.com/delightroom/xcode-xctemplate-filetemplate-을-통해-팀-생산성을-높여보자-ff2d20f5eaa0 [Xcode] XCTemplate(FileTemplate)을 통해 팀 생산성을 높여보자 딜라이트룸 iOS 그룹의 생산성 높이기 me..