Tôi đang cố gắng gửi và nhận tin nhắn NSNotificationCenter
trong Objective-C. Tuy nhiên, tôi không thể tìm thấy bất kỳ ví dụ nào về cách thực hiện việc này. Làm thế nào để bạn gửi và nhận tin nhắn thông qua NSNotificationCenter
?
Tôi đang cố gắng gửi và nhận tin nhắn NSNotificationCenter
trong Objective-C. Tuy nhiên, tôi không thể tìm thấy bất kỳ ví dụ nào về cách thực hiện việc này. Làm thế nào để bạn gửi và nhận tin nhắn thông qua NSNotificationCenter
?
Câu trả lời:
@implementation TestClass
- (void) dealloc
{
// If you don't remove yourself as an observer, the Notification Center
// will continue to try and send notification objects to the deallocated
// object.
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
- (id) init
{
self = [super init];
if (!self) return nil;
// Add this instance of TestClass as an observer of the TestNotification.
// We tell the notification center to inform us of "TestNotification"
// notifications using the receiveTestNotification: selector. By
// specifying object:nil, we tell the notification center that we are not
// interested in who posted the notification. If you provided an actual
// object rather than nil, the notification center will only notify you
// when the notification was posted by that particular object.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveTestNotification:)
name:@"TestNotification"
object:nil];
return self;
}
- (void) receiveTestNotification:(NSNotification *) notification
{
// [notification name] should always be @"TestNotification"
// unless you use this method for observation of other notifications
// as well.
if ([[notification name] isEqualToString:@"TestNotification"])
NSLog (@"Successfully received the test notification!");
}
@end
... ở một nơi khác trong lớp khác ...
- (void) someMethod
{
// All instances of TestClass will be notified
[[NSNotificationCenter defaultCenter]
postNotificationName:@"TestNotification"
object:self];
}
[super dealloc]
cuộc gọi trong phương thức dealloc không được phép theo ARC; phần còn lại là tốt
Để mở rộng theo ví dụ của dreamlax ... Nếu bạn muốn gửi dữ liệu cùng với thông báo
Trong mã đăng bài:
NSDictionary *userInfo =
[NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName:
@"TestNotification" object:nil userInfo:userInfo];
Trong việc quan sát mã:
- (void) receiveTestNotification:(NSNotification *) notification {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}
self
trong phương thức receiveTestNotification không?
Điều này đã giúp tôi:
// Add an observer that will respond to loginComplete
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(showMainMenu:)
name:@"loginComplete" object:nil];
// Post a notification to loginComplete
[[NSNotificationCenter defaultCenter] postNotificationName:@"loginComplete" object:nil];
// the function specified in the same class where we defined the addObserver
- (void)showMainMenu:(NSNotification *)note {
NSLog(@"Received Notification - Someone seems to have logged in");
}
Nguồn: http://www.sm Knob.net/snippet/Sounden/Simple%20NSNotificationCenter%20example
Ngoài ra còn có khả năng sử dụng các khối:
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter]
addObserverForName:@"notificationName"
object:nil
queue:mainQueue
usingBlock:^(NSNotification *notification)
{
NSLog(@"Notification received!");
NSDictionary *userInfo = notification.userInfo;
// ...
}];
nếu bạn đang sử dụng NSNotificationCenter để cập nhật điểm của bạn, đừng quên gửi nó từ chủ đề chính bằng cách gọi dispatch_async
:
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"my_notification" object:nil];
});
SWift 5.1 của câu trả lời được chọn cho người mới
class TestClass {
deinit {
// If you don't remove yourself as an observer, the Notification Center
// will continue to try and send notification objects to the deallocated
// object.
NotificationCenter.default.removeObserver(self)
}
init() {
super.init()
// Add this instance of TestClass as an observer of the TestNotification.
// We tell the notification center to inform us of "TestNotification"
// notifications using the receiveTestNotification: selector. By
// specifying object:nil, we tell the notification center that we are not
// interested in who posted the notification. If you provided an actual
// object rather than nil, the notification center will only notify you
// when the notification was posted by that particular object.
NotificationCenter.default.addObserver(self, selector: #selector(receiveTest(_:)), name: NSNotification.Name("TestNotification"), object: nil)
}
@objc func receiveTest(_ notification: Notification?) {
// [notification name] should always be @"TestNotification"
// unless you use this method for observation of other notifications
// as well.
if notification?.name.isEqual(toString: "TestNotification") != nil {
print("Successfully received the test notification!")
}
}
}
... ở một nơi khác trong lớp khác ...
func someMethod(){
// All instances of TestClass will be notified
NotificationCenter.default.post(name: "TestNotification", object: self)
}