본문 바로가기

iOS

(41)
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..
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..
iOS) Build input file cannot be found 에러 해결 Git으로 협업할 때 project.pbxproj 충돌 해결 xcode로 작업하다가 다음과 같은 에러가 발생했을 때 여러 원인이 있을 수 있다. Info.plist 파일의 위치가 잘못됐을 때 프로젝트 명을 바꾼 후 경로가 이상해졌을 때 Xcode 10으로 업그레이드 한 후 그치만 나의 경우 Git으로 협업할 때 머지하는 과정에서 project.pbxproj 파일에 충돌이 발생해서였다. 정확히 말하자면 충돌이 발생하지 않았다.😡 아무 충돌없이 머지되어 잘 된줄 알았는데 날벼락같이 저런 에러가 발생했다. 혹시나 하는 마음에 project.pbxproj을 열어보니 문제가 됐던 파일인 Badgeable.swift가 중복되어 생성되어있었다. 나와 다른 팀원이 둘 다 같은 이름의 파일을 생성하고 머지해서 생긴 문제..
iOS) NavigationBar의 Border 지우기 xcode에서 NavigationBar를 만들었을 때 다음과 같이 선이 생긴다. 스토리보드 상에서 지울수 있는 방법이 없을까 찾아봤지만 없는듯하다. 대신 코드에서 지우는 방법을 찾았다. override func viewDidLoad() { super.viewDidLoad() setNavigationBar() } func setNavigationBar() { self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:.default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.layout..