Combine 실습 2

yongbeom kwak·2022년 7월 24일
0

Combine

목록 보기
3/5
post-thumbnail

아래 과제는 개발하는 정대리님 콤바인 디바운스 강의 내용입니다.

과제 목표

  1. Search Bar를 이용하여 SearchBar의 Text를 구독
  2. 해당 텍스트를 중앙에 있는 label에 옮김
  3. 단, 항상 값을 옮기지않고 1초의 텀을 주고 더 이상 작업이 없을 때 값을 옮긴다.
  4. [weak self]를 통하여 약한 참조를 구현한다.
  5. 값이 비어있을 때 역시 값을 옮기지 않는다.
import UIKit
import Combine

class ViewController: UIViewController {
    
    
    @IBOutlet var myLabel: UILabel!
    private var searchController : UISearchController  = {
        let searchController = UISearchController()
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.tintColor = . black
        searchController.searchBar.searchTextField.accessibilityIdentifier = "mySearchBarTextField"
        
        return searchController
    }()
    
    var mySubscription = Set<AnyCancellable> ()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.navigationItem.searchController = searchController
        searchController.isActive = true
        
        searchController.searchBar.searchTextField
            .myDebouceSearchPublisher
            .sink { [weak self] (receivedValue) in
                //구독할 때 self를 사용할 때는 약한 참조를 사용한다 .
                self?.myLabel.text = receivedValue
            }.store(in: &mySubscription)
    }
    
    
}


extension UISearchTextField {
    var myDebouceSearchPublisher : AnyPublisher<String, Never> {
        NotificationCenter.default.publisher(for: UISearchTextField.textDidChangeNotification, object: self)
        //노티피케이션 센터에서 UISearchTextField 가져옴
        
            .compactMap { $0.object as? UISearchTextField}
            .map{$0.text ?? ""}
            .debounce(for: .milliseconds(1000), scheduler: RunLoop.main) //1초 있다가 탐지 함 , 항상 감지하는 것을 방지하기 위해
            .filter{$0.count > 0 }//비어있지 않을 때만
            .eraseToAnyPublisher() // Unwrapped 함
        
    }
}

결과

정리

.debounce 함수
.eraseToAnyPublisher 함수

profile
IOS개발 공부생

0개의 댓글