NSNotificationCenter: pass Notification between 2 classes - iphone

i have 2 classes.
class1 gets some information through the net. when one of these informations comes, class1 has to send a notification to class2.
i understood it so that i have to put
[[NSNotificationCenter defaultCenter] postNotificationName:at"anyUserNotification" object:class2];
into class1
[[NSNotificationCenter defaultCenter] addObserver:self selector:atselector(anyInteraction:) name:dontKnowTheSense object:dunno2];
have i understood the object:class2 in the postnotification right ?
if yes: is it possible to make an anonymious notification, so that the sending class must not know, which and how many classes are listening ?
or - at least i think so, have i understood the whole notification incorrect ?
besides the notification i dont need to pass any data, but in one case it would be helpful to pass an enum
so, could anybody please help me ?
btw: i cant find a way to post an at on this windows-pc and i dont know, why it did not indent the code, i think i made 4 spaces

Object is not a mandatory argument you can set it to nil or the object sending the notification message.
[[NSNotificationCenter defaultCenter] postNotificationName:#"NotificationName" object:notificationSenderOrNil];
When listening you can filter to only do something for notification sent by a specific sender.
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(sel) name:#"NotificationName" object:notificationSenderOrNil];
And you can pass your data in a dictionnary with userInfo: argument.
Is it Ok with that ?

Related

Swift: How to receive a remote notification from server?

This is a general question, but I can't seem to find a straight answer, and I'm not sure what to look for. I have a backend that sends notfications when someone likes something you posted, I am able to send it and the app receives it. However, I'm not sure how to create a UI to handle the notification. My first guess was that, since receiving notifications triggers didReceiveRemoteNotification fetchCompletionHandler in the AppDelegate, I should try to get the current VC in that function and add graphical elements from there. However, I read that this is not something you should do, and that you should use NSNotifications instead. The problem is I'm not sure I understand how I can articulate remote notificattions with the NSNotificationsCenter.
What do you recommend?
NSNotification is part of Observer design pattern.
It like a "broadcast".
First you have to register every component which should be listening the event :
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(myFonction) name:#"Notif name" object:nil];
//swift
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(myFonction), name: "notif name", object: nil)
Next, when you have a message to broadcast, post a notification with the same name :
[[NSNotificationCenter defaultCenter] postNotificationName:#"Notif name" object:nil];
//swift
NSNotificationCenter.defaultCenter().postNotificationName("notif name", object: nil)
When you will post the notification, the method myFonction will be called on the target

Why I cannot receive the Notification

[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationForbidAdvPost object:nil];
I define postNotificationName:kNotificationForbidAdvPost in a .h file
Im my subclass of NSApplication, I import this .h file. And have a observer of this Notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(changeToRecordingStatus) name:kNotificationForbidAdvPost object:nil];
I am sure that the observer was added first, and then post the notification.
And I see the [UINotification default] in Debug. It have same memory address in two part of code.
Is there some mistake I have?
Thanks!
The documentation is pretty clear when it states that
The method specified by
notificationSelector must have one and
only one argument (an instance of
NSNotification).
http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html#//apple_ref/doc/uid/20000219-CHDCIGGB
So, I see your selector you are registering is changeToRecordingStatus when it must be changeToRecordingStatus:
- (void) changeToRecordingStatus: (NSNotification *) notification;
I have try that add a arugument, but it is still not worked.
I create a new project and use a no-argument function to response Notification, it is worked normally.
The reason why I cannot receive the Notification is that a removeObserver method was called at one part which I didn't notice.
Thanks for all your reply.

NSNotification to be called like in a For loop

I have a parser class and a view controller class. In the parser class i am sending a request and receiving an asynchronous response. I want to download the same several times but while sending different parameters each time. I have registered an observer in the class:
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(dataDownloadComplete:) name:OP_DataComplete object:nil];
and then post a notification in :
-(void)connectionDidFinishLoading:(NSURLConnection *)
connection method of the parser class.
[[NSNotificationCenter defaultCenter] postNotificationName:OP_DataComplete object:nil];
I can't enclose the observer inside a For loop. What better alternative is there? Please help. Thanks in advance.
You probably do not need a for loop at all. As you said you send a request asynchroniously, so just send it in your observer code instead of making a for loop. Then you get back to your observer after response is downloaded.

how to use NSNotification in objective c

I don't know how to use NSNotification in our iphone application. and one more doubt of difference between delegate and NSNotification because both are communicating through objects.
and give the practical example.
=> NSNotificationCenter provides a centralized hub through which any part of an application may notify and be notified of changes from any other part of the application.
=> Observers register with a notification center to respond to particular events with a specified action.
=> Each time an event occurs, the notification goes through its dispatch table, and messages any registered observers for that event.
Use Of NS-Notification in Objective C
//Write from where you want to pass the data
[[NSNotificationCenter defaultCenter]postNotificationName:#"TeamTable" object:hdImage userInfo:nil];
Here
**TeamTable is notification observer name (Unique name)
**hdImage is what data you want to pass to another controller
Now write these code in that Controller from where you want to receive
the data
-(void)viewWillAppear:(BOOL)animated{
[[NSNotificationCenter defaultCenter]addObserver:self selector:#selector(detailsData:) name:#"TeamTable" object:nil];
}
-(void)detailsData:(NSNotification*)sender{
//In sender it contain All received data
}
It’s important for objects to remove observers before they’re deallocated, in order to prevent further messages from being sent.
-(void)viewWillDisappear:(BOOL)animated{
[[NSNotificationCenter defaultCenter]removeObserver:self name:#"TeamTable" object:nil];
}
For More Details about NS-Notification You can follow this Link http://nshipster.com/nsnotification-and-nsnotificationcenter/

What is the purpose of NSNotification

i am new Notification.what is the purpose of it...
can we use [[NSNotificationCenter defaultCenter] addObserver without postNotification,
If we can do it,how it is identified?what is the relationship between addObserver and postNotification?any one can explain in detail?
it's rather straight forward: you define an event by giving it a unique name, then you add an observer to it using [[NSNotificationCenter defaultCenter] addObserver and point it to a selector that receives the event.
then later on in your code you can postNotification and if the unique name matches the one you registered for - the selector you provided will be called.