iOS

  • [iOS] 특정영역만으로 QR 코드 스캔하기(feat. AVFoundation)

    [iOS] 특정영역만으로 QR 코드 스캔하기(feat. AVFoundation)

    최근 프로젝트를 하면서, AVFoundation를 활용하여 QR code scanner를 구현한 경험이 있습니다. 공식문서를 통하여 해당 기능을 구현한 경험을 소개하고, 더 나아가 전체 Camera Preview 속 모든 input이 아니라, 특정 영역만을 포커싱하여 QR 코드를 인식하는 코드 또한 소개해보도록 하겠습니다.  AVFoundation?시각과 청각과 관련된 에셋, 디바이스 카메라 제어, 오디오 처리 등을 구성할 수 있는 Framework시청각 자산으로 작업하고, 디바이스 카메라를 제어하고, 오디오를 처리하고, 시스템 오디오 상호 작용을 구성할 수 있다. (AVFoundation을 활용하기 전에 대충 해당 Framework가 카메라를 다룰 수 있다는 것은 알고 있었는데, 오디오도 처리하는지는 ..

  • [iOS] TabbarController의 presentingViewController(feat.currentContext)

    [iOS] TabbarController의 presentingViewController(feat.currentContext)

    UITabbarController위에 쌓여있는 ViewController들의 presentingViewController가 무엇인 지에대해서 알아보자. 문제 상황은 아래와 같았다. 먼저 현재 개발하고 있는 앱은 UITabbarController에 3개의 tab이 존재했고, 해당 tab들은 각각 UINavigationController로 구현이되어있다. 즉, UITabbarViewController → MypageViewController(UINavigationController) → … 여러 개의 ViewController가 stack 형식으로 들어가있다. 만약 MyPage에서 push를 통해서 올라간 맨 위 ViewController가 TicketRefundRequestViewController라고 가..

  • [iOS] JSONEncoding과 URLEncoding의 차이점(Alamofire/Moya)

    [iOS] JSONEncoding과 URLEncoding의 차이점(Alamofire/Moya)

    최근 프로젝트에서 Moya 라이브러리를 활용하여 네트워크 로직을 구현하던 중, 제대로 공부를 하지 않고 활용하여 API 통신을 실패한 경험이 있다.(스웨거만 제대로 봤어도..) Moya에서 TargetType을 채택한 API를 구성할 떄, 아래와 같이 HTTP Task를 구성한다. var task: Task { switch self { case .login(let provider, let DTO): let params: [String: Any] switch provider { case .kakao: params = ["accessToken": DTO.accessToken] case .apple: params = ["idToken": DTO.accessToken] } return .requestParame..

  • [iOS] CollectionView Reordering (feat. WWDC 20)

    [iOS] CollectionView Reordering (feat. WWDC 20)

    Collection view를 활용하여, 아래와 같은 reordering을 구현하는 방법을 한번 알아보겠습니다!(with ListConfiguration) 먼저 reordering과 관련된 WWDC 20의 Advances in diffable data sources를 정리하고 구현해보도록 하겠습니다. Diffable datasource의 가장 큰 장점은 유니크한 item identifier를 통하여 Collection view의 데이터를 모델링할 수 있다는 것입니다. 이러한 유니크한 item identifier를 통하여, 프레임워크가 자체적으로 reordering된 변화점을 알아서 확인하지만, 이것만으로는 충분하지 않습니다. 우리의 앱은 유저가 발생시킨 reordering 작업을 알아차려야지, 새로운 r..

Swift

  • [Swift] 셀 재사용에 따른 중복 binding 이슈(feat.disposeBag)

    [Swift] 셀 재사용에 따른 중복 binding 이슈(feat.disposeBag)

    최근 RxSwift를 활용한 프로젝트 속 diffable datasource를 통해서 collection view를 구현하던 중, collection view의 아이템이 많아지니 collection view에 binding된 여러 요소들에게서 예상치 못한 에러가 발생했다. 먼저 에러가 생기는 기존의 코드를 확인해보자. self.datasource = UICollectionViewDiffableDataSource( collectionView: self.collectionView, cellProvider: { [weak self ] collectionView, indexPath, item in guard let cell = collectionView.dequeueReusableCell( withReuseId..

  • [Swift] Async, Await (2) [feat. WWDC]

    [Swift] Async, Await (2) [feat. WWDC]

    해당 글에서는 Swift Concurrency의 성능에대해서 알아봅니다. (WWDC21 Swift Concurrency Behind the Scenes 21분까지의 내용을 정리했습니다.) 두 가지를 중점적으로 볼 것입니다. - Threading Model (GCD와의 비교) - Actor를 활용하여 Synchronization을 하는 방법 Threading Model 아래와 같은 앱이 있다고 생각해봅시다. - Main Thread에서는 유저의 event gesture를 처리 - Main Thread는 비동기 Serial Queue에 loadNewsFeeds()를 호출한다. Serial Queue에서 Work를 비동기적으로 던지는 이유? -> 왜냐하면 main thread는 유저의 input을 받을 준비를..

  • [Swift] Async, Await(1) (feat. WWDC)

    [Swift] Async, Await(1) (feat. WWDC)

    아래는 WWDC21 Meet async/await in Swift 및 Swift concurrency: Behind the scenes를 보고 정리한 내용입니다! 만약 네트워크 통신을 통해서 이미지를 받아오고, 썸네일을 만들어본다고 가정해봅시다. 해당 과정은 아래의 도식화된 그림과 같은 과정을 따르게 됩니다. 근데, dataTask(with:completion:) 메소드와 prepareThumbnail(of:completionHandler:)의 경우에는 시간이 오래걸리기에 비동기 코드를 활용해야됩니다. 그러면 아래와 같이 completion handler를 활용한 코드로 구현할 수 있습니다. 위 코드에는 보자마자 알 수 있드시, 생길 수 있는 문제점들이 많습니다. 먼저 completionHandler를 ..

  • [Swift] WWDC21 - ARC in Swift: Basics and Beyond

    [Swift] WWDC21 - ARC in Swift: Basics and Beyond

    해당 글은 WWDC21 - ARC in Swift: Basics and Beyond를 공부하고 난 후, 정리한 글입니다! 먼저 오브젝트의 라이프 타임과 Swift의 ARC에 대해서 복습해보겠습니다. 오브젝트의 라이프타임은 초기화와 같이 시작이되고, 마지막 사용 이후에 라이프 타임은 종료됩니다. 라이프 타임 이후에는 ARC가 자동으로 메모리 할당 해제하게 됩니다. 그리고 Swift Compiler는 retain/release 작업의 삽입을컴파일 타임에 진행합니다. 여기서 말하는 retain 작업은 런타임에 reference count를 증가시키고, release 작업은 reference count를 감소시킵니다. 마지막으로 reference count가 0이되면, 오브젝트는 할당해제가 됩니다. 예를 통해서..

  • [Swift] [weak self]는 언제 사용할까?

    [Swift] [weak self]는 언제 사용할까?

    우리는 무의식적으로 [weak self]를 활용할 때가 매우 많습니다. 흔히 [weak self]를 활용하는 이유를 메모리 릭이라고 합니다. 그렇다면, 우리는 항상 [weak self]를 활용하면 될까요? [weak self]를 언제 사용하고, 무엇인 지 공부해 보겠습니다.(weak를 남발하는 것의 side effect는 다른 글에서 공부해보겠습니다!) 먼저 클로져의 캡쳐 현상에 대해서 간단하게 알아보겠습니다. 클로져의 캡쳐 클로저는 내부에서 외부 변수를 사용할 때, 해당 변수를 클로져 내부적으로 저장합니다. 근데, 해당 변수가 값 타입이든 참조 타입이든지 간에 무조건 memory capture를 합니다. 즉, 클로져 안에서 값 타입인 외부 변수를 수정하면 참조 타입과 같이 변경이 되는 것이죠. 쉽게 말..

  • [Swift] WWDC16 Understanding Swift Performance(3)

    [Swift] WWDC16 Understanding Swift Performance(3)

    저번 글 포스트에 이어서 계속해서 WWDC16 Understanding Swift Performance를 정리해 보겠습니다. 이번에는 Generic 타입 변수가 어떻게 저장되고 복사되는 지를 이야기해보겠습니다. 또한, method dispatch 또한 어떻게 진행되는 지 알아보겠습니다. 아래와 같은 코드가 존재한다고 해봅시다. 위 코드는 제네릭을 활용하여 제네릭 타입을 Drawable 프로토콜로 제약을 주었습니다. 그렇다면 위 코드와 그냥 파라미터 타입을 Drawable로 설정한 코드는 어떠한 차이가 있을까요? Generic 타입은 Static Polymorphism을 지원합니다. 또 다른 말로는 Parametric Polymorphism이라고도 합니다. 위와 같은 코드에서 foo 함수가 실행되면, Sw..