분류 전체보기
UserDefaults 값 하나로 앱 진입시 1회만 검사하는 로직 관리하기
앱을 서비스하다보면 버그개선 또는 업데이트 안내 등의 이유로 단 1회만 동작하는 코드가 필요할 때가 있습니다. 예를 들어, TiTi에서는 비어있는 기록 객체인 Daily가 사라지지 않아서 Log화면에 기록이 있는 것 처럼 보이는 버그가 있었는데요,보다시피 기록이 비어 있는데도 날짜 아래에 점이 찍혀 있습니다 (기록이 있는 경우에만 점이 찍혀 있어야함) 이를 해결하기 위해서는 두 가지 동작이 필요 했습니다. 1. 사용자가 기록을 편집해서 그 날의 기록을 모두 지우는 경우 Daily객체를 삭제한다.2. 버그 개선 전에 존재했던 비어있는 Daily객체를 모두 삭제한다. 여기서 2번은 사용자가 앱을 진입할 때 1회만 작업하면 되는 내용입니다.여러번 동작해도 문제는 없겠지만, 비어 있는 Daily객체를 찾기 ..
modalPresentationStyle 설정 시점(feat.ViewLifeCycle)
사이드 프로젝트에서 투명한 ViewController를 띄울 일이 생겼는데, `modalPresentationStyle = .overFullScreen` 을 viewDidLoad() 시점에 작성했더니 다음과 같은 문제가 있었다. viewDidLoad()는 present() 이후에 호출되어 View를 메모리에 로드하는데,아마 present()하는 당시에 새로운VC가 가진 modalStyle을 적용하는 듯 하다.present 에니메이션 적용하려면 그래야 할 것 같다.. 그래서 present하기 전에 modalStyle을 변경해주어야 하는데, 보통은 present하는 VC에서 설정해주지만,외부에서 해당 ViewController를 컨트롤하지 않도록 하기 위해 init()시점에 modalStyle을 적용..
네이버 부스트 캠프 8기 챌린지 (feat. 중도하차)
네이버 부스트 캠프 챌린지 과정은 짧은 시간동안 CS+관련직무에 대한 언어 지식을 빠르게 키울 수 있는 과정입니다 더불어 개발할 때 꼭 필요한 도구나 지식에 대해서도 학습할 수 있습니다! 과정 과정은 일주일 단위로 진행된다. 매 주 팀원이 새롭게 구성되는데, 같은 포지션(iOS) 4~5명과 함께 한 주 동안 팀이 되어 활동한다 활동 내용은 매일 바뀌는 미션을 해결하고, 다음날 오전에 팀원들과 리뷰+회고를 하는 방식 이 시간을 의미있게 쓰고 싶어서 팀원들에게 코드리뷰를 코멘트로 달아주자고 했었다! 덕분에 코드리뷰하는 방법과 다른사람의 코드를 분석하는데 도움이 많이 되었던것 같다 👍 네부캠에는 직무에 능숙한 사람보다 해당 직무를 처음 접하는 사람이 꽤 많았다 그래서 Swift언어를 처음 사용해보는 팀원들도 ..
네이버 부스트 캠프 8기 합격후기
네이버부스트캠프(네부캠)은 네이버 커넥트 재단에서 주관하는 프로그램이에요! 대외활동 중에서는 퀄리티가 꽤 높다고 생각해 취준하면서 도전해보았습니다 과정은 서류합격 이후에 두 번의 코테가 있습니다 서류 주변에 지난 네부캠에 합격했던 사람들이 많아서 도움을 많이 받았어요! 네이버가 자소서를 굉장히 중요하게 생각하는것 같습니다 공개채용 때도 그렇고 자기자신에 대해 고민해볼 수 있는 질문이 많았어요 ❓ 왜 개발자가 되고 싶나요? 소프트웨어 개발을 더 잘하고 싶어서 시도했던 경험 “해야 하는데”에서 끝나지 않고 실천했거나, ~ 자기주도적으로 사고하고 행동한 경험 열린 사고로 동료와 협력한 경험 개인적으로 이런 질문을 좋아하는데, 개발자로서 나를 다시 돌아보고 고민해볼 수 있어서 좋은것 같습니다! 네부캠은 협업&몰..
[UIKit] TableView Multiple Cell, multi type json data parsing
TableView는 하나의 Cell이 아닌 다양한 Cell을 가질 수 있습니다.종종 앱을 보다보면 tableview 중간중간 광고가 나온다거나, 나를 위한 추천을 한다거나 ...대부분의 앱 서비스가 tableview를 사용하고, multiple cell을 사용합니다.그래서 저도 multiple cell을 사용하여 다음과 같은 앱을 만들어 볼것입니다! 데이터 가져오기먼저 멀티타입 데이터를 어떻게 가져올 것인지에 대해 고민해야합니다.(JSON에 대한 내용은 접은글에 있습니다)더보기let JSONData ="""{ "data" : [ { "type" : "TITLE_ONLY", "title" : "Struct vs Class" }, ..
[Swift] 재사용 가능한 NetworkManager만들기 (feat. Generic)
지난번에 이런 글을 썼었는데, https://990427.tistory.com/112 [Swift] json value type이 달라지는 response에 대응하여 API Responder만들기 요즘 Set이 된 나의 개발 스타일,, 중복을 다 제거해버리자 지금 하고 있는 프로젝트에서 API를 다음과 같이 명세했습니다 그래서 어떤 api를 호출하냐에 따라 form의 변화는 없지만 data의 값은 항상 990427.tistory.com 상태 코드를 받을 수 없다는 문제점도 있었고, 모듈마다 다 다른 MoyaProvider를 사용하다보니까 저번에 만든 함수의 쓰임이 좀.. 별로랄까? 그래서 개선해보자!고 생각했고 조금더 유연하게 사용할 수 있도록 BaseNetworkManager를 만들기로 했습니다. Ba..
[UIKit] CustomDatePicker 만들기 (3/3)
Rx를 모르신다면 이해하기 어려울 수 있습니다 🥹 드디어 마지막 관문.. 년,월을 관찰하여 일 수를 정하자! 일단 나는 지금 이걸 만드는 중이다 년,월은 의존성이 없지만, '일'은 년,월에 의존성을 가지게 된다. 1월은 31일까지, 2월은 28일까지 뭐이런거 ~.. 그래서 '일'은 년,월이 바뀌면 reset을 해주어야 한다. 예를들어 2023년1월31일을 만들어준 상태에서 '월'을 2월로 바꾸면 31일은 없기 때문에!! 그래서 customPicker에서 뭔가를 선택했을 때 관찰하는 대상에게 알려줄 수 있도록 Rx를 추가적으로 적용했다. (1/3)에서 만들었던 CustomPickerButton에 추가한 부분! public class CustomPickerButton: UIButton { var change..
[Swift] 서버에 iOS 이미지 보낼 때 용량 이슈 & 해결
이미지 업로드 구현중에 생긴 이슈 form-data로 아이폰 사진첩에 있는 이미지를 서버로 보내려면 JPEG로 변환해야 합니다 아이폰에서 기본적으로 HEIF 확장자로 사진을 저장하는데, 이는 호환성이 떨어지기 때문입니다 어쨌든 우리는 PHPicker를 통해서 사진첩에 있는 사진을 가져올 수 있고, 이를 jpeg로 변환하기 위해 jpegData를 사용합니다 image.jpegData(compressionQuality: 1.0) 사실 뒤에 1.0은 기본값이라고 생각하고 아무 생각없이 썼는데 얘때매 이슈가 생길줄이야... Moya를 통해 API 통신을 하는데, 계속 이런 에러가 뜨는 것.. Failed to map data to a Decodable object. postman으로 아이폰 사진첩에 있는 사진 ..
[UIKit] toast message 만들기
앱을 만들다보면 toast msg를 띄워서 정보를 주는 경우가 많은데 아쉽게도 iOS에는 그런 기능이 없다.. 직접 만들자! 우선 UIView를 상속하는 class를 만들어 줍니다 public class ToastMessage: UIView {} 저는 요론 종류의 토스트 메세지를 만들거에요 (x는 제외) 그래서 이런 프로퍼티와 enum이 필요합니다 public enum ToastType { case common, alert, info } var text = UILabel() var icon = UIImageView() var type : ToastType UI는 각자 취향껏 만드시고 (생략) 토스트 메세지의 특징은 잠깐 떴다 사라지는거 잖아요 ? 그 부분을 구현하기 위해 animate를 사용했습니다 an..
[Swift] json value type이 달라지는 response에 대응하여 API Responder만들기
요즘 Set이 된 나의 개발 스타일,, 중복을 다 제거해버리자 지금 하고 있는 프로젝트에서 API를 다음과 같이 명세했습니다 그래서 어떤 api를 호출하냐에 따라 form의 변화는 없지만 data의 값은 항상 달라진다 일단 json을 파싱할 struct를 만들어주어야 하는데, 모든 api마다 struct를 만들게 되면 이런식으로 계속해서 DTO struct의 중복이 일어나게 된다 중복이 너무 싫은 나.. 제네릭으로 묶자! struct ResponseDTO : Decodable { var success : Bool var data : CommonDataDTO var error : ErrorDTO? } struct ErrorDTO : Decodable, Error { let code : Int let mes..