본문 바로가기

SwiftUI

(8)
SwiftUI) Widget - (1) Meet Widget 이번 글은 iOS 14부터 추가된 Widget과 관련된 시리즈 글 중 첫 번째 글입니다. 제목에서도 알 수 있듯이 WWDC 2020 - Meet WidgetKit을 바탕으로 작성하였습니다. 글에 오류가 있거나 궁금한 점이 있으시면 언제든 댓글 남겨주세요. 감사합니다:) WidgetKit Show relevant, glanceable content from your app on the iOS Home screen or macOS Notification Center. Apple Developer - WidgetKit iOS 14 부터 새롭게 나온 위젯은 더 dynamic하고 personalized합니다. 또한 bold하고 glanceable하게 디자인 됩니다. 이전에는 위젯이 화면의 가장 왼쪽에 위치한 To..
SwiftUI) 사용자 이벤트 수집 및 Alert로 확인 사용자 이벤트 사용자 이벤트란? 사용자가 앱을 이용하면서 발생할 수 있는 상황에 대해 정의한 것으로, 앱 개선을 위해 수집할 만한 정보를 선정하여 데이터화 한 것입니다. 크게 화면 전환 이벤트와 버튼 클릭 이벤트가 있을 수 있습니다. protocol Event { var name: String { get } var createdAt: String? { get } var metadata: [String: String]? { get } } 이벤트가 무엇에 대한 것인지 이벤트명(name)과 생성된 날짜(createdAt), 기타 세부사항(metadata)를 수집하였습니다. 예로 홈 화면에서 플레이리스트 화면으로 전환되었다는 것을 다음과 같이 표시할 수 있습니다. Event(name: "PlaylistViewd..
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..
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..
SwiftUI) 다이나믹 리스트 SwiftUI에서 다이나믹한 리스트 만들기 SwiftUI에서 List나 ForEach를 사용할 경우 각 요소를 어떻게 구분할지 지정해줘야한다. 즉, Unique Identifier를 지정해줘야 한다. 이는 두 가지 방식으로 가능하다. 1) Key Path List(landmarkData, id: \.id) { landmark in LandmarkRow(landmark: landmark) } struct Landmark { var id: Int var name: String fileprivate var imageName: String fileprivate var coordinates: Coordinates var state: String var park: String var category: Categor..