2016-05-31 3 views
0

는이 코드를 건너 왔어요 :NSNotificationCenter 사용 :

는 관찰자가 먼저 제거하고 다시 추가 왜
- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 

    [nc removeObserver:self name:Hide object:nil]; 
    [nc addObserver:self selector:@selector(MarkHide:) name:Hide object:nil]; 

} 

?

+1

나는이 질문을하기에 좋은 사람이이 코드를 작성한 사람이라고 생각한다. 나는 컨트롤러가 동일한 알림에 여러 번 등록되는 것을 방지해야한다고 생각합니다. 그것이 올바른 접근법이라면 - 물론 - opinon-based. – Eiko

+0

이론 상으로는 ViewController가 Home을 누르고 다시 보여 주면 viewDidAppear :를 두 번 호출해야합니다. 옵저버를 제거하지 않으면 통지를 게시하면'MarkHide :'가 두 번 트리거됩니다. – Larme

답변

0

나는이 관용구를 전에 보았습니다. 누군가 관찰자를 원했지만 오직 하나의 관찰자입니다. 처음으로 viewDidAppear가 호출되면 관찰자가 없으므로 제거하지 않아도되고 관찰자가 추가됩니다. 두 번 이상 호출하면 이전 관찰자가 제거되고 새 관찰자가 추가됩니다.

저는 관찰자가 추가되었는지 여부를 나타내는 BOOL 속성을 갖는 것을 선호합니다. 그러면 관찰자가 필요하고 속성이 NO이면 관찰자를 추가하고 속성이 NO이면, 관찰자를 제거합니다. 관측자와 속성은 YES입니다 (BOOL 속성의 설정자에 코드를 넣을 수 있습니다).

정말 멋진 솔루션은이 모든 작업을 수행하고 연결된 객체를 사용하여 상태를 저장하는 NSObject 확장을 추가하는 것입니다.

1

같은 알림 관찰자를 여러 번 추가하면 여러 번 알림을 받게됩니다.

Observers

는 VC의 생명주기 동안 사용될 수있는 또는보기가 ... 전경 또는 시간 등의 기간 동안 단지 때 뷰가 실제로 볼 때

viewDidAppear가 호출됩니다. VC의 수명주기 동안 viewDidAppear은 여러 번 호출 될 수 있습니다 (모달 VC - VC 상단에 있었고 -보기가 다시 표시됨).

그래서이 경우 VC는보기가 포어 그라운드 인 동안 알림을 수신하려고합니다. 그리고 그것은 여러 번 호출되기 때문에 관찰자가 한 번만 추가되었다는 것을 확신 할 수 있도록 두 가지 옵션이 있습니다. boolean 변수 - isObserverAdded (더 나은 방법)을 사용하여 관찰자가 이미 추가되었는지 확인하거나 관찰자를 제거하고 추가하십시오.

관련 문제