NSNotificationCenter 多次调用
NSNotificationCenter is calling multiple times
我已经在我的应用程序中实现了 NSNotificationCenter。图像解码完成后,我会发送通知。第一次图像解码将完成 8 times.So 通知假设发送 8 times.But 它正在调用 64 次(8*8)。
这是我的代码是如何实现的-->
// 初始化
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(getHRImage:)
name:@"DecodeComplete" object:nil];}
//调用方法
-(void)getHRImage:(NSNotification *) notification
{
if ([[notification name] isEqualToString:@"DecodeComplete"])
NSLog (@"Successfully received the DecodeComplete notification! ");
}`
// 解除分配
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"DecodeComplete" object:self];
//[super dealloc];
}
//Post通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"DecodeComplete" object:self];
有人可以告诉我哪里做错了。
提前致谢。
//调用方法是这样的(调用8次)
-(void)decode
{
NSLog(@"---------- Decoding is Complete ---------");
[[NSNotificationCenter defaultCenter] postNotificationName:@"MdjDecodeComplete" object:self];
}
- (void) dealloc
不会在 ARC 环境中被调用。 Instread,你可以在添加之前删除你的观察者,如下所示:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"DecodeComplete" object:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getHRImage:) name:@"DecodeComplete" object:nil];
}
}
解法:
我重新检查了我的代码,initWithFrame:(CGRect)frame 调用了 8 次并添加了 NSNotification 观察器 8 次。
所以我已经像这样更改了我的代码,--->> 初始化。
static bool note=YES;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
if(note)
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(getHRImage:)
name:@"DecodeComplete" object:nil]; note=NO;}
--->> 解除分配
- (void) dealloc
{
note=true;
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"DecodeComplete" object:nil];
//[super dealloc];
}
现在 addObserver 方法仅调用一次,所以我的问题已解决。
感谢大家的宝贵指导。
我已经在我的应用程序中实现了 NSNotificationCenter。图像解码完成后,我会发送通知。第一次图像解码将完成 8 times.So 通知假设发送 8 times.But 它正在调用 64 次(8*8)。
这是我的代码是如何实现的--> // 初始化
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(getHRImage:)
name:@"DecodeComplete" object:nil];}
//调用方法
-(void)getHRImage:(NSNotification *) notification
{
if ([[notification name] isEqualToString:@"DecodeComplete"])
NSLog (@"Successfully received the DecodeComplete notification! ");
}`
// 解除分配
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"DecodeComplete" object:self];
//[super dealloc];
}
//Post通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"DecodeComplete" object:self];
有人可以告诉我哪里做错了。
提前致谢。
//调用方法是这样的(调用8次)
-(void)decode
{
NSLog(@"---------- Decoding is Complete ---------");
[[NSNotificationCenter defaultCenter] postNotificationName:@"MdjDecodeComplete" object:self];
}
- (void) dealloc
不会在 ARC 环境中被调用。 Instread,你可以在添加之前删除你的观察者,如下所示:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"DecodeComplete" object:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getHRImage:) name:@"DecodeComplete" object:nil];
}
}
解法: 我重新检查了我的代码,initWithFrame:(CGRect)frame 调用了 8 次并添加了 NSNotification 观察器 8 次。
所以我已经像这样更改了我的代码,--->> 初始化。
static bool note=YES;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
if(note)
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(getHRImage:)
name:@"DecodeComplete" object:nil]; note=NO;}
--->> 解除分配
- (void) dealloc
{
note=true;
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"DecodeComplete" object:nil];
//[super dealloc];
}
现在 addObserver 方法仅调用一次,所以我的问题已解决。 感谢大家的宝贵指导。