flutter의 BLoC 패턴

 

플러터에서도 Provider나 stream을 제공하는데 Notification Center은 Swift에서 비슷할 역활을 한다고 보면 된다. 아직 Design Pattern에 대해 수박 겉햟기 식으로만 보았는데 아마 이것들이 base일 것이다.

 


 

NotificationCenter은 등록된 Observer에게 동시에 Notification을 전달하는 클래스이다. 특정 객체가 NotificationCenter에 등록된 Event를 발생시키면(Post라고 한다.) NotificationCenter에 등록된 Observer들이 Event에 대한 행동을 처리하고 이를 대기한다. 여기서 전체 흐름은 동기적으로 흘러가는데, 이를 aysnc으로 사용하려면 NotificationQueue를 사용하면 된다.

 

 

사용 방법은 아래와 같다.

 

Post

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func postBtnTapped(_ sender: Any) {
        NotificationCenter.default.post(
            name: NSNotification.Name(rawValue: "PostButton"), 
            object: nil)
    }
}

코드가 굉장히 직관적이다.

버튼을 Tap하였을 경우, NotificationCenter에 "PostButton" 이라고 하는 Event를 등록하고 이를 발생시킨다는 뜻.

이때, object 파라미터를 통해 Event를 발생시킬 때 특정 Object를 같이 넘길 수 있다. 

 

 

Event...너를 지켜보고 있다

 

Observer

class ObserverOneViewController: UIViewController {

    @IBOutlet weak var hiddenLabel: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        NotificationCenter.default.addObserver(self, 
            selector: #selector(showLabel), 
            name: NSNotification.Name(rawValue: "PostButton"),
            object: nil)
    }
    
    @objc func showLabel(){
        hiddenLabel.layer.isHidden = false
    }
}

NotificationCenter에 Observer을 추가하는 것을 한눈에 찾아볼 수 있다.

여기서 이 객체(self)를 name(위에서 설정한 "PostButton"이라는 Event가 발생했을 경우,

selector에 지정되어 있는 함수(showLabel)를 동작시킨다.

 

추가의 방법에는 두가지의 방법이 존재한다. 위 예제에선 후자

func addObserver(forName name: NSNotification.Name?, 
                 object obj: Any?, 
                 queue: OperationQueue?, 
                 using block: @escaping (Notification) -> Void) -> NSObjectProtocol

NotificationQueue를 만들어서 이걸 사용하고 싶다면 필요할 경우 Main Thread에서 사용하도록 잘 처리해야 한다.

 

func addObserver(_ observer: Any, 
                 selector aSelector: Selector, 
                 name aName: NSNotification.Name?, 
                 object anObject: Any?)

 

 

중요한 것은 생성한 Observer는 추후에 제거를 해주어야 하는데,

이는 flutter에서는 생성한 스트림을 close해주는 것이 있었는데 비슷한 이치이다.

func removeObserver(_ observer: Any, 
                    name aName: NSNotification.Name?, 
                    object anObject: Any?)
                    
//NotificationCenter.default.removeObserver(self, name: .changeLabel, object: nil)

 

제대로 제거해 주지 않으면 Observer가 소속된 오브젝트가 해제 되었을 때, Notification 이 전달되면 문제가 생긴다.

+ Recent posts