티스토리 뷰

반응형

 

 

오늘은 iOS의 Combine framework를 활용해서 UIView, UIButton(UIControl을 상속받는 애들)의 탭 이벤트(+ throttle publisher event)를 Custom Publisher를 만들어서 구독하고, UI와 바인딩해서 사용해보는 시간을 갖도록 합니다.

 

 

프로젝트는 UILabel, UIButon을 중앙에 배치시켰습니다. 이제 위에 있는 UILabel, UIButton에 탭이벤트를 적용시켜볼 예정입니다.

 

 


ViewController.swift 초기 모습

생성한 ViewController 파일 초기 모습입니다. 임의의 이름으로 UIButton, UILabel (centerButton, centerLabel)을 생성했습니다. 그리고 Publisher 구독정보를 관리한 cancellables를 만들었습니다. buttonTapCount, labelTapCount는 각각의 view에 대한 탭 이벤트가 잘 작동하는지 확인하기 위해 사용합니다.

 

 

 


UIControl+Extension
UIControl 상속받는 UIView들의 이벤트 처리하는 Publisher 만들기

UIControl을 상속받는 놈들에 대한 이벤트를 방출하는 Publisher를 구현해 보겠습니다. Publisher를 구성하기 앞서 먼저 Subscription을 만들겠습니다. Subscription은 Subscriber가 처음 구독을 할때 Publisher로부터 받는 정보입니다.'

52행) Subscriber, 받으려는 이벤트인 Publisher의 Output 타입으로 지정할 Control(UIControl), UIControl.Event 이벤트 타입을 생성자에서 받아서 이벤트를 연결하고 있습니다. 우리가 명령형 프로그래밍을 했을때 작성하는 addTarget 코드를 여기에 작성해줍니다. 

58행) Subscriber는 수신한 subscription의 request(_ demand: Subscribers.Demand) 메소드를 통해 특정 요청을 할수도 있는데, 지금은 이 메서드에 특별히 정의할 필요는 없어서 비웠습니다.

64행) 이벤트가 발생하면 Subscriber는 Publisher로부터 이벤트를 받게 됩니다.

 

 

 

이제 드디어 텝 이벤트를 방출할 Publisher를 만드는 모습입니다. Combine의 Publisher는 이벤트를 방출하고, Subscriber가 구독을 할 수 있습니다. 

24행) Output을 UIControl로 하고 있습니다. 

35행) Subscriber가 Publisher를 구독할때 Publisher가 실행하는 메서드입니다. 여기에서 Subscription을 만들어서 Subscriber에게 전달하고 있습니다. 이 과정에서 UIControl을 상속받는 UIView와 Publisher간의 구독이 발생하고, 이후 Subscriber는 이벤트를 받을 수 있습니다.

 

 

실제 ViewController에서 사용할 메서드입니다. 특정 시간동안 중복 이벤트를 무시해주는 Throttle Publisher를 반환하고 있습니다. 이제 이걸 사용하면 UISlider, UIButton 같은 UIControl을 상속받는 놈들이 Publisher이벤트를 구독할 수 있습니다.

* 반환타입의 첫번째 제네릭타입은 Publisher, 두번째 제네릭타입은 Scheduler를 의미함

위 throttle publisher 사용을 하기 전에 마저 UIControl을 상속받지 않는 UIView를 위한 throttleTap Publisher를 만들어보겠습니다.

 


UITapGestureRecognizer+Extension, UIView+Extension
UIControl 상속받지 않는 UIView들의 이벤트 처리하는 Publisher 만들기

앞서 UIControl+Extension.swift에서 구성한 Subscription, Publisher와의 큰 차이점은 Publisher의 Output 타입이 UIControl이 아닌 UITapGestureRecognizer라는 것입니다.

이 경우에도 마찬가지로 Subscription의 생성자에서 이벤트를 연결시키고, 이번엔 eventHandler를 통해 이벤트가 발생할때마다 UIControl이 아닌 UITapGestureRecognizer 타입으로 이벤트를 방출해주고 있습니다.

UIControl+Extension때 처럼 Publisher에서는 Subscriber의 구독을 감지하고 Subscription을 생성해서 이벤트를 연결하고, 그 정보를 Subscriber에 전달하는 메서드를 구현해줍니다.

 

 

 

UIControl을 상속받지 않은 UIView를 위한 throttleTapGesturePublisher() 메서드입니다. 이경우에는 upstream publisher type이 UITapGestureRecognizer로 되어 반환이 됩니다.

이번에 구현한 메서드들도 반환되는 Publisher들은 1초 동안 첫 이벤트를 제외한 중복 이벤트를 허용하지 않고, 메인스레드에서 동작합니다.

이제 ViewController에서 사용해보겠습니다.

 

 


ViewController에서 Publisher 구독해서 throttleTapPublisher event 받기

UIControl을 상속받는 UIButton타입을 가진 centerButton은 throttleTapPublisher()를 사용하고 이벤트가 방출될 때마다 카운팅을 하고 버튼 타이틀도 업데이트 됩니다.

UIControl을 상속받지 않는 UILabel타입의 centerLabel은 UITapGestureRecognizer를 Output 타입으로 사용하는 throttleTapGesturePublisher()를 사용합닌다. 이 또한 카운팅을 하고, 이벤트가 방출할때마다 타이틀이 바뀌도록 UI 바인딩을 한 모습입니다.

이렇게 구현된 프로젝트를 실행해보면, UILabel, UIButton 모두 정상적으로 throttleTap event를 받는 것을 알 수 있습니다.

터치이벤트가 발생하면 1초 간의 시간동안 다수의 이벤트가 발생했을때 첫번째 탭 이벤트를 제외한 이후 이벤트는 전부 무시가 됩니다.

아래에 UILabel, UIButton 탭 예시영상과 관련 프로젝트 git repository 링크도 남깁니다. 의견이나 질문 있으시다면 댓글 부탁드립니다. 즐거운 코딩되세요~ 감사합니다. 🤗.

https://tv.kakao.com/v/433485923

 

GitHub - applebuddy/MasteringCombine: Study for Udemy lecture; The Complete Guide to Combine Framework in iOS Using Swift

Study for Udemy lecture; The Complete Guide to Combine Framework in iOS Using Swift - GitHub - applebuddy/MasteringCombine: Study for Udemy lecture; The Complete Guide to Combine Framework in iOS U...

github.com

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함