답변:
응용 프로그램의 모든 클래스는 응용 프로그램의 다른 알림에 대한 "관찰자"가 될 수 있습니다. 뷰 컨트롤러를 생성 (또는로드) 할 때이를 관찰자로 등록하고 UIApplicationDidBecomeActiveNotification
해당 알림이 애플리케이션으로 전송 될 때 호출 할 메소드를 지정해야합니다.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(someMethod:)
name:UIApplicationDidBecomeActiveNotification object:nil];
자신을 정리하는 것을 잊지 마십시오! 시야가 멀어지면 관찰자로 자신을 제거하십시오.
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIApplicationDidBecomeActiveNotification
object:nil];
알림 센터 에 대한 추가 정보 .
스위프트 3, 4 상당 :
관찰자 추가
NotificationCenter.default.addObserver(self,
selector: #selector(applicationDidBecomeActive),
name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
object: nil)
관찰자 제거
NotificationCenter.default.removeObserver(self,
name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
object: nil)
콜백
@objc func applicationDidBecomeActive() {
// handle event
}
viewDidLoad
또는 viewWillAppear:animated
예를 들어. 또한 더 이상 알림이 필요하지 않거나 deinit 메소드에서 관찰자 인스턴스가 할당 해제 될 때 관찰자를 제거 할 수 있습니다
신속한 등가 2 :
let notificationCenter = NSNotificationCenter.defaultCenter()
// Add observer:
notificationCenter.addObserver(self,
selector:Selector("applicationWillResignActiveNotification"),
name:UIApplicationWillResignActiveNotification,
object:nil)
// Remove observer:
notificationCenter.removeObserver(self,
name:UIApplicationWillResignActiveNotification,
object:nil)
// Remove all observer for all notifications:
notificationCenter.removeObserver(self)
// Callback:
func applicationWillResignActiveNotification() {
// Handle application will resign notification event.
}
removeObserver
스위프트 에 넣을 수 있는 최고의 장소 : deinit
method.
스위프트 4.2
관찰자 추가
NotificationCenter.default.addObserver(self, selector: #selector(handleEvent), name: UIApplication.didBecomeActiveNotification, object: nil)
관찰자 제거
NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
이벤트 처리
@objc func handleEvent() {
}
Swift 4에서는 Apple이 새로운 컴파일러 경고를 #selector
통해이 시나리오에서 사용하지 않는 것이 좋습니다 . 다음은이 작업을 수행하는 훨씬 안전한 방법입니다.
먼저 알림에 사용할 수있는 게으른 var를 만듭니다.
lazy var didBecomeActive: (Notification) -> Void = { [weak self] _ in
// Do stuff
}
당신이 포함 실제 통지가 필요한 경우, 바로 교체 _
와 함께 notification
.
다음으로 앱이 활성화되는 것을 관찰하기 위해 알림을 설정했습니다.
func setupObserver() {
_ = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive,
object: nil,
queue:.main,
using: didBecomeActive)
}
여기서 큰 변화는를 호출하는 대신 #selector
위에서 만든 var 를 호출한다는 것입니다 . 이렇게하면 잘못된 선택기 충돌이 발생하는 상황을 제거 할 수 있습니다.
마지막으로 관찰자를 제거합니다.
func removeObserver() {
NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
}
#selector
@objc
Swift 4에서 속성으로 선언 된 메소드를 호출 할 수 있습니다 .
removeObserver(self
않았기 때문에 사용이 올바르지 않습니다 . 당신이해야 다음let observer = NotificationCenter.default.addObserver
removeObserver(observer
@objc
. 그러나 그것을 시도 할 때 콘솔에 경고가 나타납니다 (Xcode 11.3.1 (11C504), Swift 13.3) : BackgroundTask를 종료 할 수 없습니다 : 식별자가있는 백그라운드 작업이 없습니다. NSObjectProtocol과 같은 변수에 관찰자를 저장하더라도.
@objc
변형을 사용하면 경고 메시지가 표시됩니다 .
스위프트 5
fileprivate func addObservers() {
NotificationCenter.default.addObserver(self,
selector: #selector(applicationDidBecomeActive),
name: UIApplication.didBecomeActiveNotification,
object: nil)
}
fileprivate func removeObservers() {
NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
}
@objc fileprivate func applicationDidBecomeActive() {
// here do your work
}
NSNotificationCenter
. 감사합니다!