ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift Swizzling
    Swift 2021. 7. 16. 17:35

    ios Developer 오픈 채팅방에서 Swizzling에 대한 내용이 나와, 프로젝트에 살짝 도입해본적이 있는 해당 내용을 적어보도록 하겠다.

     

    Method Swizzling

    : 런타임에 정적으로 메소드를 호출할때 중간에 가로채서 커스텀 한 뒤 호출할 수 있게 한다.

     

    쓰는 경우?

    - 앱에 분석 기능을 통합할때(?

    우리 앱에 GA(Google Analytics)를 붙인다고 할때, 화면을 시작하는 viewWillAppear 메소드 안에 GA API를 호출한다. 

    수백개의 viewController에 직접 넣을 수 없으니 method 를 커스텀 하겠다는 것이다.

    - 로그를 넣거나, 급하게 UILabel에 어떤 값을 공통으로 해야된다던지 등등,,,

    - 무언가 동일한 동작

     

    사용방법 

    아래는 viewWillDisappear를 method swizzling 한 예시이다.

    extension UIViewController {
    
        @objc func viewWillDisappearOverride(_ animated: Bool) {
            self.viewWillDisappearOverride(animated) //Incase we need to override this method
            if self.isMovingFromParent {
                SpinnerManager.shared.stopSpinner()
            }
        }
    
        static func swizzleViewWillDisappear() {
        //Make sure This isn't a subclass of UIViewController, So that It applies to all UIViewController childs
            if self != UIViewController.self {
                return
            }
            let originalSelector = #selector(UIViewController.viewWillDisappear(_:))
            let swizzledSelector = #selector(UIViewController.viewWillDisappearOverride(_:))
            guard let originalMethod = class_getInstanceMethod(self, originalSelector),
                let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) else { return }
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
    
    //To activate it - just call UIViewController.swizzleViewWillDisappear() from AppDelegate from inside didFinishLaunchingWithOptions

    위의 코드를 실행하기 위해서는 

    AppDelegate에

    UIViewController.swizzleViewWillDisappear()

    위 코드를 작성하면 된다.

     

    짧은 결론

    하지만 이는 임시 방편으로 사용된다고 봐야할것 같다.

    더 좋은 방식으로 추후 리팩토링 하는것이 좋다. (Custom Class를 상속받는 식으로 한다던지)

     

     

     

    출처 : swizzleViewWillDisappear.swift (github),  https://zeddios.tistory.com/554

    728x90

    'Swift' 카테고리의 다른 글

    ios 웹뷰와 통신 (Native <-> JavaScript 통신)  (0) 2021.07.21
    Combine  (0) 2021.07.20
    Swift Async / Await  (0) 2021.07.09
    Swift Thread 처리에 대해 (Operation Queue vs Dispatch Queue)  (0) 2021.07.07
    URL Session 에 대해서  (0) 2021.07.06

    댓글

Designed by Tistory.