我正在查看TestFlight中的崩溃报告,最常见的崩溃是:
无法从“ListArchiver 0x1d5b83b0”中删除关键路径“batchImageDownloadingInProgress”的观察者“ListViewController 0x1d590500”,因为它未注册为观察者。
在ListViewController
:
- (void)viewWillAppear:(BOOL)animated
{
...
[[WanderlistArchiver sharedArchiver] addObserver:self forKeyPath:@"batchImageDownloadingInProgress" options:NSKeyValueObservingOptionNew context:nil];
}
// **** the error happens in here ****
- (void)viewWillDisappear:(BOOL)animated
{
...
[[WanderlistArchiver sharedArchiver] removeObserver:self forKeyPath:@"batchImageDownloadingInProgress"];
}
如果我在viewWillAppear
中设置观察者(并且不要在代码中的任何其他位置触摸它),为什么在viewWillDisappear
运行时它仍未注册?这在过去的90天里只发生了5次,但我仍然想知道为什么会这样。
答案 0 :(得分:1)
问题很可能是每次调用viewWillDisappear:
时多次调用viewWillAppear:
。由于这似乎很少发生,所以必然会有一些奇怪的事件序列导致这种情况发生。
如果无法重现问题,一种可能的解决方法是添加BOOL
ivar。添加观察者时,在viewWillAppear:
中将其设置为YES。在viewDidAppear:
中,检查是否已设置。如果设置,则将其设置为NO并移除观察者。如果没有设置,那么你知道不要删除观察者。
答案 1 :(得分:1)
您应确保context
相同。在remove语句中,您使用的是不使用上下文的方法。使用上下文变量而不是nil
,并确保在add和remove语句中它是相同的。
请查看this question以获取更详细的说明。