전체 글 34

Alamofire의 RequestInterceptor + Actor로 토큰 갱신 구현

안녕하세요! 매우.. 오랜만에 글을 쓰는 것 같은 기분이네요🥲이 글은 최근 프로젝트를 진행하면서 구현했던 부분을 잊지 않기 위해 기록하는 겸 쓰는 거라 틀린 개념이나 불필요한 코드가 포함되어 있을 수 있습니다 :) 혹시 유사한 방법을 찾으신다면 참고만 해주세요!! 문제 상황우선 상황은 한 View에서 API 콜이 동시에 여러 번 일어나고 그 과정에서 토큰이 만료되는 경우 Alamofire의 Interceptor를 활용해 토큰을 갱신해주고 있는 상황입니다. 그리고 서버에서 토큰이 갱신되는 경우, Access뿐만 아닌 Refresh가 함께 갱신되면서 생길 수 있는 문제를 단계별로 나타내면 아래와 같았습니다. 한 View에서 API 콜이 A, B가 거의 동시에 발생두 콜 모두 사용하던 AceessToken..

iOS 2025.09.15

📚 Concurrency

Defining and Calling Asynchronous Functionsasynchronous function / asynchronous method실행 도중 일시적으로 중단될 수 있는 특수한 함수 / 메서드비동기 함수임을 나타내기 위해서는 async 키워드 사용에러를 던지는 함수라면 throws 앞에 작성func listPhotos(inGallery name: String) async -> [String] { let result = // ... some asynchronous networking code ... return result}비동기 메서드 호출 시, 해당 메서드 반환까지 실행이 일시 중지됨= 결과가 올 때까지 기다려야 하므로 멈춤을 의미실행이 일시 중단될 수 있는 지점 표기를..

Study 2025.06.11

📚 Closure

클로저(Closure)코드 내에서 사용되거나 전달될수 있는 기능적인 블럭타 언어의 closure, anonymous function, lambda 와 유사정의된 컨텍스트 내 모든 상수와 변수에 대해 참조를 캡처하고 저장할 수 있음이러한 것을 closing over라고 함함수에서 소개된 전역/중첩 함수는 클로저의 특별한 경우 클로저의 3가지 형태전역 함수는 이름이 있고 어떠한 변수도 캡쳐하지 않는 클로저중첩 함수는 이름이 있고 해당 코드 내에서 캡쳐된 변수가 있는 클로저클로저 표현식은 lightweight 구문쓰여진 주변부 변수를 캡쳐할 수 있는 이름없는 클로저 클로저 문법을 간결하게 만들어주는 요소 4가지문맥에서 매개변수와 반환 타입을 추론(Inferring parameter and return valu..

Study 2025.06.02

📚 Concurrency Docs 내 일부

Tasks and Task GroupsTask비동기 작업 단위Task는 한 번에 한 가지만 수행하지만 여러 Task를 작업할 경우, Task Group을 통해 동시에 실행되도록 해줄 수 있음async-let실행될 작업에 대해 하위 작업이 생성됨계층 구조의 작업이 가지는 이점상위 작업에서 하위 작업이 완료될 때까지 대기하위 작업에서 작업의 우선순위를 높인다면 상위 작업의 우선순위도 함께 상향됨상위 작업이 취소되면 하위 작업이 자동으로 취소됨작업 내 데이터들이 하위 작업에서도 효율적으로 쓰일 수 있음작업 결과를 반환하지 않는 TaskGroup// 작업의 그룹 생성 await withTaskGroup(of: Data.self) { group in let photoNames = await listPhoto..

Study 2024.09.11

🍎 WWDC21 : Explore structured concurrency in Swift

🍎 WWDC21 : Explore structured concurrency in SwiftStructured Programming구조화 된 프로그래밍정적 범위를 사용해당 범위 내에서만 변수 사용 가능조건부로만 코드가 실행됨범위 벗어나면 종료제어흐름을 보다 직관적으로 알 수 있음프로그램을 위에서 아래로 읽을 수 있음 Completion Examplefunc fetchThumbnails( for ids: [String], completion handler: @escaping ([String: UIImage]?, Error?) -> Void) { guard let id = ids.first else { return handler([:], nil) } let request = thumbn..

Study 2024.09.07

👀 Continuation 알아보기

👀 Continuation ?async 메서드 호출 시, 스레드의 제어권을 포기하는 suspended 현상이 발생함제어권이 다시 돌아왔을 때, 어디서부터 실행할 지에 대한 정보가 있어야함이 때, Suspension Points를 통해 파악하고 중지된 시점부터 재실행함이처럼 작업이 일시정지되고 그 시점부터 재실행되는 것을 Continuation 이라고 명칭 Suspension PointSwift Concurrency 작업이 일시정지되어 결과를 기다리는 지점= 비동기 작업 완료 후 다시 실행되는 시점❓ Heap에 저장되는 이유비동기 작업의 상태 추적힙은 동적으로 메모리를 할당해 복잡한 상태를 유지할 수 있음메모리 관리비동기 함수가 일시정지되었을 때에도 메모리 상에 계속 해당 지점이 남아있어야함즉, 해당 객..

Study 2024.08.24

🍎 WWDC21: Meet async/await in Swift

🍎 WWDC21: Meet async/await in Swift비동기 함수의 공통점호출하면 작업 시작 후 스레드의 차단을 빠르게 해제장기 실행 작업이 완료되는 동안 스레드가 다른 작업 수행 가능 Completion Handle Example일부 작업에 시간이 걸림prepareThumbnaildataTask완료 시, completionHandler를 통해 결과 반환하지만 실패 시에는 어떠한 알림도 받을 수 없음이미지가 보여지지 않고 무한 로딩네 가지 작업을 동기적으로 처리하되 그 내부의 두 작업은 비동기적으로 처리코드의 의도를 명확하게 파악하기 어렵다는 문제가 있었음이를 위해 Result Type을 활용함Result Type을 통해 의식적으로 에러를 보내줄 수 있게됨하지만 여전히 코드를 직관적으로 이해하..

Study 2024.08.20

📚 ARC Docs 정리

작동원리새로운 인스턴스 생성 시, 인스턴스에 대한 정보가 메모리에 할당인스턴스가 필요없어지면 메모리에서 할당 해제해당 인스턴스에 더이상 접근 불가접근하려고 한다면 에러가 발생인스턴스가 도중에 사라지지 않도록 모든 곳에서의 참조를 추적인스턴스에 참조가 하나라도 존재하는 한 메모리에서 해제하지 않음이를 위해 강한 참조를 통해 인스턴스를 참조함 기본 동작class Person { let name: String // 인스턴스 초기화 시 출력 init(name: String) { self.name = name print("\(name) is being initialized") } // 메모리에서 해제 시 출력 deinit { print("\..

Study 2024.08.06

🍎 WWDC : ARC in Swift

ARC수명주기가 다한 객체의 할당을 해제하여 메모리를 관리하는 방식- 참조 횟수를 추적하여 객체의 수명을 결정함- Swift 컴파일러에 의해 수행됨 retain | 참조가 시작되는 시점에 삽입release | 참조가 끝나는 시점에 삽입 컴파일 시점에 처리됨RC가 0으로 떨어지면 객체가 메모리에서 해제됨class Travler { var name: String var destingation: String?}func test() { // 객체 생명주기 시작 let t1 = Traveler(name: "Lily") // Referece Start(1) // init => RC(t1) = 1 // retain // => RC(t1, t2) = 2 let t2 = t1 // End(1), Start(2) /..

Study 2024.08.02

❓ Enum(2)

안녕하세요!이전에는 Enum이란 뭐고 어떻게 사용하는지, 원시값 RawValue가 뭔지 알아봤습니다!오늘은 Enum의 연관값이랑 CaseIterable이라는 프로토콜을 채택해서 어떻게 활용할 수 있는지 알아볼게요🔥  🧐 연관값은 왜 필요할까이전에 사용했던 예제를 살펴보면 각 OS에 대해 명시하고 있기는 하지만 각 OS가 몇 버전인지는 명시해주고 있지 않습니다enum AppleOS { case iOS case MacOS case TvOS case WatchOS} 그런데 이제는 iOS이면서 최신버전인 17.5일 때, 무언가를 처리하고 싶은 겁니다그러면 이런 식으로 사용하게 되겠죠?switch AppleOS { case .iOS: if version == 17.5 { ..

Swift 2024.07.12