본문 바로가기

전체 글

(385)
[concurrency] swift async/await 다른 언어를 사용하다가 ios쪽 개발을 할때 코루틴과 같은 시퀀셜한 비동기 처리가 없는점이 매번 아쉬웠는데.. swift 5.5 부터 async await 가 지원되기 시작했다. 당연하게도 애플쪽 하위호환이란건 바라지도 말아야 하는지라... 그나마 xcode 13.2 부터 사용 가능하니 내부 샘플 프로젝트등에 적용해 보려고 대강 내용만 정리해 본다. ios15 이하를 타겟으로 하는 경우 import _Concurrency 와 같이 비공식적으로 사용해야 한다. (이마저 없었으면 한 2년 뒤에나 사용할 듯) async @MainActor func getSomething() async -> [Int] { } 비동기 메쏘드는 메쏘드명 다음에 async 라는 키워드로 정의된다. 메인 쓰레드에서 동작해야 하는 경우..
[Combine] 콜백 기반 여러 처리 결과를 배열로 받기 특정 키로 콜백 기반 api를 여러번 호출한 다음에 해당 결과들을 모아 배열로 받으려 한다. 콜백 호출 함수 구독시 결정되도록 Deferred를 리턴하고, 콜백을 반환하는 함수의 호출 결과를 얻기위해 단일 퍼블리셔인 Future로 구성 에러가 필요 없는 경우 예외에 대해 success("") 로 리턴. func getSomeValue(id: String) -> AnyPublisher { return Deferred { Future { [weak self] promise in guard let self = self else { return promise(.success("") } self.someAsyncMethod(id: id) { result in return promise(.success(result..
[SwiftUI] 오디오 레벨 에니메이션, Shape 오디오 레벨이나 오브젝트 주변을 인지하기 쉽도록 하기위해 펄스 에니메이션이 사용되곤 한다. 보통 원형으로 스케일을 통해 에니메이션을 구현하는데~ 제공 하는 Circle shape를 사용해 간단히 구현할 수 있다. 뷰의 state 나 뷰모델에서 level 값을 퍼블리싱 한다고 가정하면... ZStack { Circle() .frame(width: 150, height: 150, alignment: .center) .foregroundColor(Color.yellow) .scaleEffect( (CGFloat(self.viewModel.level) / 100.0) + 1) .opacity(0.2) .animation(Animation.easeIn(duration: 0.1)) Circle() .frame(wi..
[SwiftUI] NavigationView LayoutConstraints warnings SwiftUI 에서 NavigationView 사용시에 .navigationBarTitle(_, displayMode:) 를 설정하게되면 layout constraints 관련 경고가 발생한다. 이 경우 네비게이션뷰 스타일을 .stack 으로 지정해 주면 해당 경고는 사라진다. var body: some View { NavigationView { SomeView { } .navigationBarTitle("HelloWorld", displayMode: .inline) } .navigationViewStyle(.stack) }
dataTaskPublisher 재시도 및 출력 타입 변경 retry(_ retries:) 상위 스트림을 다시 시도하는 메쏘드는 retry 이고 오류 발생시 해당 횟수 만큼 재시도 하게 된다. retry 의 경우 이전 스트림을 다시 시도하므로, dataTaskPublisher 에 retry 를 걸게 되면 오류 발생시 바로 재시도를 수행한다. 더불어 URLError에 대해서만 retry 가 일어나게 된다. dataTaskPublisher 로 데이터를 가져올때 단순 재시도가 아닌 일정시간 딜레이를 두어 재시도를 하는 케이스를 한번 살펴보자. 추가적인 에러 처리를 더하기 위해 별도 함수를 하나 추가한다. 이 메쏘드에서는 response 에 대한 추가적인 에러 처리와 Output을 Data 형식으로 변경했다. URLError 이외에 http status code와 같은..
Framework SPM 배포 spm 으로 framework 를 배포하기 위해서는 swift 5.3 이상이 필요하고, xcframework 로 빌드되어야 한다. 아키텍처별로 framework 생성후에 xcframework 를 생성한다. XCFramework 만들기 (tistory.com) 생성된 xcframework 를 git 저장소에 업로드 해당 저장소에 Package.swift 파일 생성한다. // swift-tools-version:5.3 import PackageDescription let package = Package( name: "MyLibrary", platforms: [ .iOS(.v13), ], products: [ .library(name: "MyLibrary", targets:["MyFramework"]), ],..
URLSession.DataTaskPublisher DataTaskPublisher URLSession 은 combine publisher인 DataTaskPublisher를 제공한다. dataTaskPublisher(for:) 메쏘드로 publisher를 생성 할 수 있으며, 결과는 듀플( Data: , URLResponse)로 전달된다. public struct DataTaskPublisher: Publisher { typealias Output = (data: Data, response: URLResponse) typealias Failure = URLError let request: URLRequest let session: URLSession func receive(subscriber: S) where S: Subscriber, S.Failure..
엑스박스 시리즈 엑스 : 올 엑세스 작년 겨울을 지나며 이제 차세대기를 한대 들일까 마음먹은지 무려 8개월. 정말 이렇게 구하기 어려울 것이라 생각치도 못한 기기 엑스박스 시리즈엑스(엑시엑)이 드디어 손에 들어왔다. 쿠팡 및 네이버 0초컷(구매 버튼을 못 봤음), 11번가 1초컷 등등 환상속에만 존재하리라 생각했던 엑시엑. skt 올엑세스 2번째 도전에서 약 20초컷의 경쟁률을 뚫고 성공. (이번에 실패하면 시리즈 에스를 구매하려고 했음) skt 올엑세스는 2년(24개월)간 매달 39,900원으로 기기와 게임패스(얼티)를 제공하는 서비스이다. 렌탈이라기보다는 24개월 무이자 할부 같은 느낌. skt 정책은 매달 39,900원(에스는 29,900원)으로 새롭게 게임패스 1개월을 결재하는 방식이라 기존 게임패스 가입자도 제한 없이 이용할 수 ..