NSNotification, UserInfo and Object Methods

在处理NSNotification时,了解userInfo字典至关重要,它提供了访问接收者可能感兴趣的额外对象的途径。当同一个通知应用于多个对象时,理解object方法也很有用。文中详细介绍了如何在MoviePlayerController播放结束后,通过添加观察者监听MPMoviePlayerContentPreloadDidFinishNotification,并从userInfo字典中获取播放结束原因的整数值,以便判断播放停止的具体情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值