분류 전체보기
-
왜 Task 기반의 비동기 프로그래밍인가?Modern C++/Task 기반 비동기 프로그래밍 2020. 8. 27. 21:18
개발을 시작할 때만 해도 C++에서 스레드를 지원하지 않아 이를 직접 개발해서 사용해 왔다. C++ 11 이 후에 스레드가 표준 라이브러리로 추가되었다. 하지만 C++ 도 자바나 Swift, Kotolin과 같이 스레드를 태스크 내부에 숨기고 태스크를 이용해 많은 부분 개발이 된다. 개발자는 더 이상 하드웨어 내 코어의 수에 따라 스레드를 관리하거나 스레드 풀을 구현하고 스레드가 데이터의 관리등을 위해 동기화 처리 문제등에서 조금은 벗어 날 수 있다. C++ 에서 비동기 프로그래밍을 위해서 스레드나 task를 사용한다는 사실은 ModernC++ 을 사용하는 사람은 대부분 알 수 있다. #include #include #include int main() { std::thread t([]() { for (s..
-
lottie-ios 프레임워크와 UIViewRepresentable 을 이용한 LoadingView 구현SwiftUI/MVVM 알아보기 2020. 8. 27. 20:44
로띠(lottie) 는 json 형식의 움직이는 이미지 포맷으로 aribnb에서 개발되었고 많은 웹이나 앱에서 사용되고 있다. UIKit과 SwiftUI에서는 직접 이를 지원하지 않으므로 lottie-ios 프레임워크를 Pod을 통해 설치하고 이를 통해서 LottieView를 구현할 수 있다. SwiftUI는 지원하지 않는 UIKit의 WebView 나 MapView등 사용하기 위해 UIViewRepresentable 프로토콜을 정의하고 있고 이를 구현함으로 써 쉽게 이를 SwiftUI로 전환 할 수 있다. 여기서는 lottie-ios 프레임워크와 UIViewRepresentable 프로토콜 구현을 통해 LottieView를 구현하고 이를 통해 날씨 정보를 로딩 하는 중 이를 화면에 표시하는 Loding..
-
SwiftUI 에서 CoreLocation 사용SwiftUI/MVVM 알아보기 2020. 8. 27. 15:49
이 전 블러그에서 텍스트 필드에서 입력받은 도시의 날씨를 표현하는 앱을 구현하였다. 이미지 location.fill 위치에 버튼을 추가하고 CoreLocation을 이용해 현재 좌표에 대한 날씨를 조회하도록 기능을 추가해 보자. 이 보다 먼저 ContentView의 body에서 상단 바와 날씨 정보를 보여주는 위젯을 Extract Subview를 이용해 두 영역을 하위 뷰로 분리한다. 위의 그림처럼 분리하고자 하는 VStack에 커서를 두고 ⌘ 누르고 마우스의 왼쪽키를 클릭하면 메뉴바가 나오는데 여기서 Extract Subview를 통해서 쉽게 분리할 수 있다. 뷰는 아래와 같은 구조를 가진다. struct ContentView: View { ... var body: some View { ZStack {..
-
SwiftUI MVVM 모델SwiftUI/MVVM 알아보기 2020. 8. 27. 04:45
이전 블러그에서 스트리보드를 이용한 MVC 모델에 대해서 살펴 보았다. MVC 모델은 ViewController 에 대부분의 코드가 위치하게 되고 UI 에 대한 액션도 ViewController에서 처리하고 데이터 모델을 직접 뷰에 설정해야 했다. SwiftUI 에서는 뷰 모델은 모델 데이터가 변경된 경우 이를 뷰에 통지한다. 뷰는 변경사항에 대한 통지를 받은 경우 뷰를 다시 그리게 된다. 이는 Obsever 패턴과 바인딩을 이용해 구현되어 있다. 이제 실제 어떻게 MVVM을 이용해 날씨 앱을 변경할 수 있는지를 살펴 보자 . ContentView.swift import SwiftUI struct ContentView: View { // ViewModel의 통지를 받을 수 있도록 @ObservedObje..
-
iOS 의 MVC 모델SwiftUI/MVVM 알아보기 2020. 8. 26. 00:21
iOS 앱을 제작 시 스토리 보드를 이용하는 경우는 MVC 패턴에 따라 프로젝트를 구성하고 구현하게 된다. 이는 iOS의 프레임워크가 이를 기반으로 구성되어있기 때문이다. openweather api 를 통해 도시에 대한 현재 날씨를 가져와 화면에 보여주는 간단한 예제를 통해 MVC 패턴에 대해 알아보고 SwiftUI 가 MVVM 패턴을 적용한 이유에 대해서 살펴보자. openweather api 는 REST API로 해당 요청에 대해 JSON 포맷에 대해 결과 값을 반환하는 구조로 이루어진다. 이를 사용하기 위해서는 openweather 웹사이트에서 무료로 키를 발급 받고 이 키값을 HTTP 요청에 다른 파라미터와 함께 전달해야한다. urlString = https://api.openweathermap..
-
SwiftUI ScrollView 와 ForEach 로 구현한 영화 포스트 리스트SwiftUI 2020. 8. 25. 08:12
import SwiftUI struct ContentView: View { var userData = posts var body: some View { //HStack 에 스크롤 뷰를 생성 - 수평 방향의 스크롤 뷰에는 인티케이터 비활성화 ScrollView(.horizontal, showsIndicators: false) { HStack { //userData 를 순환하면서 PostView 들을 HStack 에 넣고 ScrollView 생성 ForEach(userData) { post in PostView(post: post) } } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentVi..
-
SwiftUI LongPressGesture 를 사용한 Fingerprint ButtonSwiftUI 2020. 8. 25. 05:27
struct FingerprintButton: View { //롱프레스 제스처 상태 @GestureState var press = false //롱프레스 제스쳐 완료 상태 체크 @State var completed = false var body: some View { //3개의 이미지 와 원형 상태바 레이어용 ZStack ZStack { //1. 기본 배경 - 완료시 사라짐 Image("fingerprint1") .opacity(completed ? 0 : 1) .scaleEffect(completed ? 0 : 1) //2. 진행 중에 위로 이동하면서 애니메이션 Image("fingerprint2") .clipShape( Circle() .offset(y: press ? 0 : 50) ) .animat..
-
SwiftUI를 이용해 Circle Progress Bar 그리기SwiftUI 2020. 8. 25. 03:15
import SwiftUI struct RoundProgressView : View { var width: CGFloat var height: CGFloat var color1: Color var color2: Color @Binding var percent: Int; var body: some View { // width의 비율에 따라 선의 두께를 지정하기 위해 multiplier 설정 let multiplier = width / 40 //트림하고 남은 영역이 진행 상태를 나타내는 부분으로 이를 역으로 계산 //에를 들어 0.1 에서 1.0 까지 트림하는 경우 원의 10% 부분이 잘리고 남아있는 부분은 90%가 됨 let progress = 1 - (CGFloat(percent) / 100) retur..