When working with an NSNotification object, you’ll want to familiarize yourself the userInfo dictionary, which provides access to any additional objects that may be of interest to the receiver. Understanding the object method may also be helpful if you are using the same notification on more than one object.
userInfo Dictionary
Below I add an observer forMPMoviePlayerContentPreloadDidFinishNotification, which will send a message to the methodmoviePreloadDidFinish: when a MoviePlayerControllerobject has finished playing:
mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:mp];
}
Here’s how to access and print the userInfo dictionary from the notification object:
- (void) moviePlayBackDidFinish:(NSNotification*)notification
{
NSDictionary *userInfo = [notification userInfo];
NSLog(@"MPMoviePlayerPlaybackDidFinishReasonUserInfoKey: %@",
[userInfo objectForKey:@"MPMoviePlayerPlaybackDidFinishReasonUserInfoKey"]);
...
}
The value of MoviePlayerPlaybackDidFinishReasonUserInfoKey is an NSNumber object which contains an integer value specifying reason the playback finished. The possible range of return values are defined in MPMovieFinishReason, which is an enum type as shown here:
enum {
MPMovieFinishReasonPlaybackEnded,
MPMovieFinishReasonPlaybackError,
MPMovieFinishReasonUserExited
};
typedef NSInteger MPMovieFinishReason;
Pulling all this together, you could write something similar to the following to check if the user stopped playback of the movie:
if ([[userInfo objectForKey:@"MPMoviePlayerPlaybackDidFinishReasonUserInfoKey"] intValue] == MPMovieFinishReasonUserExited)
NSLog(@"User stopped playback");
object Method
One more handy method within NSNotification is the method object, which will return the object (as type id) that is associated with the notification. For example, check out the code below that sets up the notification, pay attention to the last parameter mp which is assigned to the object parameter.
mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:mp];
Within the method called by the selector, you can now access the object passed in by querying the object method:
- (void) moviePlayBackDidFinish:(NSNotification*)notification
{
MPMoviePlayerController *mpObject = (MPMoviePlayerController *) [notification object];
...
mpObject will point to the mp object defined in the previous code block – using the objectmethod you can retrieve a pointer to the object that made the original notification request.
from:http://iphonedevelopertips.com/cocoa/nsnotification-userinfo-and-object-methods.html
在处理NSNotification时,了解userInfo字典至关重要,它提供了访问接收者可能感兴趣的额外对象的途径。当同一个通知应用于多个对象时,理解object方法也很有用。文中详细介绍了如何在MoviePlayerController播放结束后,通过添加观察者监听MPMoviePlayerContentPreloadDidFinishNotification,并从userInfo字典中获取播放结束原因的整数值,以便判断播放停止的具体情况。
889





