通常我会在viewWillAppear
中添加观察者并将其移除viewWillDisappear
。在这种情况下,我需要其中一个观察者在视图消失后继续,以便它可以完成一些工作。为了确保观察者仅在此视图中添加一次,我执行以下操作:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
[[NSNotificationCenter defaultCenter]removeObserver:self
name:@"imageSaved"
object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(postMessageWithImage:)
name:@"imageSaved"
object:nil];
}
我已经对应用程序的其余部分进行了搜索,以确保此观察者未在其他任何位置注册。不幸的是,有时候,但并非所有时间都没有一致的因素,通知会被解雇两次。我还确保断点和NSLog不会多次调用postNotifcationName
。我无法在iPhone上重现,因为问题似乎仅限于iPad。
在进一步的故障排除中,我检查过该方法是从同一个线程调用的(没有理由它不会只是检查)。如果我将removeObserver
放在viewWillDisappear
中,这个问题就会消失,但是,这并不是我需要这样做的原因。
显然,这是一个观察者注册了两次,但我找不到原因的原因。从代码中可以看出,只要这个观察者注册,它就会被删除。我唯一的另一个想法是self
是否会被“损坏”,以致removeObserver
无法正常运作?
答案 0 :(得分:2)
在视图显示时添加观察者,并在消失时将其删除。
添加强>
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(postMessageWithImage:)
name:@"imageSaved"
object:nil];
}
删除:强>
- (void)postMessageWithImage:(NSNotification*)aNotification
{
[[NSNotificationCenter defaultCenter]removeObserver:self
name:@"imageSaved"
object:nil];
// here do your job
}
这是完全有效和高效的。
答案 1 :(得分:0)
不要在viewWillAppear:
中添加观察者,而是在视图在viewDidLoad
中消失时,尝试添加您希望保留的观察者。然后,您可以在removeObserver:name:object:
方法
dealloc
答案 2 :(得分:0)
如果您只想要执行一次某项内容,请将其置于dispatch_once()
来电的谓词中,例如
static dispatch_once_t lock;
dispatch_once(&lock, ^{
// put your addObserver call here
});