대부분 Json을 사용하기 때문에 XML을 사용할 일이 없었는데, OpenAPI를 하나 사용하다 보니 무조건 XML로만 데이터가 넘어와 XML을 파싱하는 법을 알아보고 적용해봤다. XMLParser Foundation에 기본으로 들어가 있는 XMLParser를 사용해 XML을 파싱할 수 있는데, Json과 달리 태그와 값으로 이루워진 XML특성상 사용을 위한 Delegate를 설정해줄 필요가 있다. 먼저 초기화는 간단하다. let parser = XMLParser(data: data) parser.delegate = subjectParser.self parser.parse() Data 타입의 XML을 XMLParser의 초기화 파라미터로 받을 수 있고, URL도 초기화시 받을 수 있는데, URL은 테스트..
저번에 UICollectionView의 Compositional Layout을 공부할 때 만들었던 영화앱의 API 통신 부분을 공부할 겸 변경하게 되었다. 영화진흥원 API를 사용해 일간, 주간 박스 오피스 리스트를 가져오고, KMDB API를 사용해 영화 상세정보를 받아와 포스터를 띄웠다. ///BoxOffice 일간, 주간 정보 모두 반환 func searchBoxOfficeInfo(dateRange: DateRange) async throws -> [MovieInfo] { let url = APIInfo.boxOfficeHost + dateRange.rawValue var dataTask: DataTask switch dateRange { case .daily: let param = BoxOffic..
비동기 작업을 하면서 발생할 수 있는 문제는 Data race 이 있다. Swift Concurrency는 이를 방지하기 위해 컴파일 단에서 오류를 내는 식으로 이를 방지하는데, Data race를 피하면서 여러 task가 하나의 자원을 공유하면서 쓰려면 어떻게 해야할까? GCD에서도 알아봤지만, data race는 여러 스레드가 하나의 자원에 동시에 접근할 때 발생할 수 있다. 읽기만 하면 문제는 없지만, 값을 변경하려고 할 때 중간에 생각했던 값이 아닌 바뀐값이 나올 수 있기 때문이다. Mutex, Semaphore를 사용해서 한번에 하나씩만 접근할 수 있게해 해결할 수 있는데, Swift Concurrency의 Actor도 한 번에 하나의 Task만 접근할 수 있게 하여 data race를 해결 할..
Task Asynchronous Function을 생성하고 실행하려 할 때 viewDidLoad나 일반적인 함수에서는 실행이 되지 않는 것을 알 수 있다. 그 이유는 Asynchronous Function은 항상 concurrent context에서 실행되어야 하기 때문이다. 이를 실행하려면 Task를 사용하면 된다. Task는 프로그램 일부를 비동기적으로 실행할 수 있는 작업 단위다. Task를 사용하면 임의의 스레드에서 다른 실행 맥락과 함께 동시에 실행된다. 그리고 각 Task는 다른 Task와 동시에 실행할 수 있다. task가 여러개 만들어 지면 task들은 각각 독립적으로 작업을 수행한다. Task Block은 비동기로 실행된다. Task block의 작업은 await를 만나 중단될 수는 있지..
WWDC 2021에서 Swift Concurrency에 대한 소개가 있다. GCD, Operation을 사용해서 비동기 작업을 수행하거나 URLSession에 complationHandler로 작업 종료 후 처리를 했는데 Swift Concurrency를 사용하면 어떤 장점이 있고, 어떻게 더 쉽고 간편하게 처리 할 수 있는지 알아보고 직접 사용해봤다. Swift Concurrency의 장점 가독성 completionHandler 콜백을 사용하지 않아 가독성이 좋아진다. 에러 핸들링 안정성 종료되는 시점에 completionHandler를 빼먹었을 때 컴파일시 문제는 없지만 에러처리가 불가능. Swift Concurrency를 사용하면 이런 에러처리를 빼먹는 실수를 방지할 수 있다. 동기화 처리 비동기 ..
Image | Apple Developer Documentation A view that displays an image. developer.apple.com Image SwiftUI 의 Image는 Asset 또는 디스크의 이미지를 보여주거나, SFSymbols를 표시할 수 있는 View. UIImage, CGImage도 가능. IOS 13.0 부터 사용가능 기본적으로 사용하는 이미지 표시 방법은 다음과 같다. Image("tempImage") Image(decorative: "tempImage") Image(systemName: "chart.bar.fill") asset에 있는 Image를 가지고 올 수 있으며 Bundle 파라미터도 존재한다. 기본값은 nil 공식 문서에서 Image 각 이미지 생성..