Program Tip

메인 스레드에 NSNotification 게시

programtip 2020. 12. 12. 12:16
반응형

메인 스레드에 NSNotification 게시


NSNotification모든 백그라운드 스레드에서 기본 스레드에 게시 할 수있는 다음 코드 조각을 찾았습니다 . 이것이 안전하고 수용 가능한 관행인지 알고 싶습니다. 제발?

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ImageRetrieved" 
                                                        object:nil 
                                                      userInfo:imageDict];
});

네 할 수 있습니다 .

일반적으로 NSNotifications가 main에서 전송되기를 원합니다. 특히 모달 로그인 대화 상자를 닫는 것과 같은 UI 활동을 트리거하는 경우 특히 그렇습니다.

특정 스레드에 알림 전달

정기 알림 센터는 알림이 게시 된 스레드에 알림을 전달합니다. 분산 알림 센터는 기본 스레드에서 알림을 전달합니다. 때로는 알림 센터 대신 사용자가 결정한 특정 스레드에서 알림을 전달하도록 요구할 수 있습니다. 예를 들어, 백그라운드 스레드에서 실행중인 객체가 창 닫기와 같은 사용자 인터페이스의 알림을 수신하는 경우 기본 스레드 대신 백그라운드 스레드에서 알림을 수신하려고합니다. 이 경우 기본 스레드에서 전달되는 알림을 캡처하고 적절한 스레드로 리디렉션해야합니다.


이것은-당신은 메인 스레드에 들어가서 알림을 게시하고 있습니다. 그보다 더 안전 할 수는 없습니다.


Swift 2 구문

dispatch_async(dispatch_get_main_queue()) {
    NSNotificationCenter.defaultCenter().postNotificationName("updateSpinner", object: nil, userInfo: ["percent":15])
}

Swift 3 구문

DispatchQueue.main.async {
    NotificationCenter.default.post(name: "updateSpinner", object: nil, userInfo: ["percent":15])
}

라인을 따라 어딘가에서 이것이 가능해졌습니다.

addObserver(forName:object:queue:using:)

어떤은 여기에 있지만, 요점은입니다 queue객체입니다.

블록을 추가해야하는 작업 대기열입니다. 을 전달 nil하면 게시 스레드에서 블록이 동 기적으로 실행됩니다.

그렇다면 메인 런 루프에 해당하는 큐를 어떻게 얻습니까?

let mainQueue = OperationQueue.main

참고 : 이것은 알림을 구독하는 경우이므로 한 번만하면 완료됩니다. 모든 단일 통화에 대해 수행하는 것은 엄청나게 중복됩니다.

참고 URL : https://stackoverflow.com/questions/15813764/posting-nsnotification-on-the-main-thread

반응형