본문 바로가기

분류 전체보기

(67)
iOS) UIViewController view를 다루는 것에 focus되어있는 controller 기본적으로 하나의 view property를 가지고 있다. 가끔 교체하는 경우도 있지만 안건드는 것이 좋다. 기본적으로 뷰 컨트롤러는 화면을 꽉 채우는 것이 목적이다. 화면을 보여주는 단위로는 스크린이 있다. 그 스크린 안에 윈도우라는 개념이 있다. 윈도우는 스크린에 들어가는 실제적인 뷰이다. 그 위에 올라가는 것이 뷰이다. 기본적으로 화면을 보여주기 위해 세 가지 정도가 있다. 초창기에는 뷰 컨트롤러가 꽉 채운 화면만 되었는데 요새는 다른 역할도 한다. ViewController와 MVC MVC 패턴에서 C 역할을 하지만 뷰에 집중되어 있다. 화면 전체 콘텐츠를 담당하거나 특정 영역을 담당한다. 앱을 개념적으로 생각해보면 어떤 뷰컨트롤러 하나..
SwiftUI) 사용자 이벤트 수집 및 Alert로 확인 사용자 이벤트 사용자 이벤트란? 사용자가 앱을 이용하면서 발생할 수 있는 상황에 대해 정의한 것으로, 앱 개선을 위해 수집할 만한 정보를 선정하여 데이터화 한 것입니다. 크게 화면 전환 이벤트와 버튼 클릭 이벤트가 있을 수 있습니다. protocol Event { var name: String { get } var createdAt: String? { get } var metadata: [String: String]? { get } } 이벤트가 무엇에 대한 것인지 이벤트명(name)과 생성된 날짜(createdAt), 기타 세부사항(metadata)를 수집하였습니다. 예로 홈 화면에서 플레이리스트 화면으로 전환되었다는 것을 다음과 같이 표시할 수 있습니다. Event(name: "PlaylistViewd..
iOS) 서버와 데이터 통신을 위해 URLRequest 작성하기 Json으로 Post하기 URLRequest 생성시 기본 헤더는 Json이 아닙니다! Network API 통신을 하여 데이터를 외부 서버로 전송할 때 보통 json 형식으로 인코딩하여 보냅니다. MongoDB로 Json 데이터를 전송하는데 데이터가 계속 이상하게 보내졌습니다. { "name" : "playlistViewed", "createdAt" : "2020-12-16T15:43:07.294+0900", "metadata" : { "from" : "today" } }보내고자 했던 형식은 위와 같은데 자꾸 보내지는 데이터는 아래와 같았습니다. { "\"name\":\"playlistViewed\",\"createdAt\":\"2020-12-16T15:43:07.294+0900\",\"metadata\..
iOS) CoreData - Migration 코어데이터 변경 및 마이그레이션 코어데이터 모델을 변경하고 마이그레이션을 하지 않았더니 다음과 같은 에러가 발생했습니다. 코어데이터를 처음 사용하는 것이라 마이그레이션을 해야한다는 것 조차 모르고 그냥 변경했더니 에러가 주르륵... 일단 급한대로 시뮬레이터에 설치된 앱을 지웠더니 에러는 사라졌습니다. 매번 코어데이터를 변경할 때마다 앱을 지우고 다시 깔 수도 없고 특히 이미 배포해 버린 후라면 유저들에게 일일이 앱을 지우고 다시 설치해달라고 할 수 없으니 코어데이터 모델을 변경하는 법을 알아봅시다. 새로운 모델 버전 추가 Add Model Version Editor -> Add Model Version 을 선택하고 이름을 버전 2라는 의미로 기존 모델 명에 v2를 추가하여 생성합니다. 그러면 다음과 같이..
SwiftUI) NavigationLink와 Memory Leak Memory Leak 지난 글인 ViewBuilder 와 guard let에서 보면 메모리 누수가 발생한 것을 알 수 있다. 이를 고치려고 AnyView를 대체했지만 소용이없었다. 그러던 중 이미지를 네트워크 api 통신을 통해 불러오는 ImageLoader객체가 비이상적으로 생성된 것을 발견하였다. 현재 네이버 바이브 클론 프로젝트를 진행중인데 음악 스트리밍 서비스인 만큼 이미지가 많이 필요한 상황이라 이미지 객체를 포기할 수 없어서 고쳐보기로 했다. 사실 뷰는 중요하지 않고 다른 것이 중요한 상황이라 이미지는 정적 이미지로 고정할 수도 있었지만 여태 만든 DB 더미 데이터와 네트워크 객체를 포기하기 아까워 고치기로 했다. 홈 화면(Today Scene)과 더보기 화면(Magazine Scene)을 왔..
SwiftUI) URL로 비동기 이미지 생성하기 - Combine과 Network 1. NetworkService 우선 네트워크 처리를 할 수 있는 객체를 생성해야 합니다. 네트워크 처리를 위해 필요한 것으로 URLSession과 URLRequest이 있습니다. URLRequest URLRequest는 네트워킹하는 곳에서 매번 생성하기에는 귀찮은 작업입니다. NetworkMethod도 String으로 입력하므로 오탈자가 발생하는 등의 문제가 생길 수도 있습니다. 따라서 따로 객체로 분리하면 더 편하게 사용할 수 있습니다. 아래 코드에서 body는 보통 post할 때 서버로 보낼 데이터를 저장합니다. enum NetworkMethod: String { case get case post case put case patch case delete } struct RequestBuilder {..
SwiftUI) ViewBuilder 와 guard let 일단 결론부터 말하면 ViewBuilder에 guard let 쓰지 마세요 🌝 AnyView와 Performance AnyView를 사용하면 퍼포먼스에 영향이 있을 수 있다고 하여 다음의 코드를 ViewBuilder로 변경하고자 하였습니다. func getDestination(to routingDestination: MiniVibeType, with id: Int?) -> AnyView { guard let id = id else{ return AnyView(ErrorView())} //TODO: 타입에따라서 다른 destination 보여주게하기! (대부분 id넘겨서 tracklist 보여주기 switch routingDestination { case .magazines: return AnyView(M..
SwiftUI) ObservableObject와 상속 ViewModel 객체 분리 뷰에서 표현해야할 데이터를 네트워킹을 통해 외부에서 가져와야할 때 ViewModel 객체로 분리시켜서 데이터를 업데이트 했습니다. 네트워킹을 통해 데이터를 가져와야 하는 뷰가 많아서 각 뷰모델이 겹치는 경우가 많아서 전체적으로 사용할 기본 뷰모델 MiniVibeViewModel을 만들었습니다. class MiniVibeViewModel: ObservableObject { private let network = NetworkService(session: URLSession.shared) private var cancellabes = Set() func internalFetch(endPoint: MiniVibeType, id: Int? = nil, filterQuery: Stri..
git) 깃 프로젝트 관리하기(1) - issue, label, project, milestone 깃 레퍼지토리에 들어가면 메뉴 바에 여러 선택지가 보인다. 이 중 Issues, Projects에 대해 다룰 것이다. 이와 관련하여 Labels, Milestones에 대해서도 다룬다. Issues 깃 레퍼지토리에 들어가면 메뉴 바에서 Issues 버튼을 클릭하면 다음과 같은 화면이 보인다. 이슈에는 개발해야할 기능이나 개발하는데 발생한 버그 등 수행해야할 과제 위주로 올린다. 보통은 수행해야할 목적을 바탕으로 제목을 작성하고 관련된 주제에 대해 라벨을 연결한다. 제목에 모든 내용을 포함하기보다 겹치는 내용은 라벨로 분리하여 가독성을 높이고 검색도 용이하게 할 수 있다. Milestones 마일스톤은 연결된 이슈의 상황을 알려준다. 이슈를 생성할 때 마일스톤을 연결할 수 있는데 이 때 최대 단 한 개의 ..
SwiftUI) MVVM과 Combine 학습 정리 SwiftUI MVVM Programming with ObservableObject @Published @ObservedObject SwiftUI 2.0 + Combine - Getting Started 을 바탕으로 학습한 내용 정리 Combine What is Combine? 비동기적(Asynchronous) 이벤트를 처리하기 위한 애플의 프레임워크 iOS 개발을 위한 코드는 Asynchronous event를 처리할 일이 많다. 이 떼 Combine을 사용하면 코드를 단순화 해준다. Advantages of Combine No More Callback Hells! 위 코드는 어떤 동작을 하고 있는지 이해하기 어렵다. 이런식으로 코드가 지저분해지는 것을 막을 수 있다. Key Concepts..