KVO在进入背景时丢失,试图修复

时间:2017-05-18 13:42:24

标签: ios objective-c background key-value-observing

我有这个方法,在 myViewController 中添加一个观察者:

-(void) observeSpeakerVolume{
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
    [[AVAudioSession sharedInstance] addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionNew context:nil];
}

我在 myViewController 的viewdidLoad中调用此方法:

- (void)viewDidLoad {
    [self performSelectorInBackground:@selector(observeSpeakerVolume) withObject:nil];
    [super viewDidLoad];
}

最后我按如下方式监视观察者:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([keyPath isEqualToString:@"outputVolume"]) {    
        if ([[change valueForKey:@"new"] isEqualToNumber:@0]){
            ...
        } else {
            ...
        }
    }
}

一切正常,但只要我的应用程序发送到后台,例如通过点击主页按钮,观察者似乎会被自动删除。

要解决这个问题,我在AppDelegate中执行此操作:

- (void)applicationWillEnterForeground:(UIApplication *)application {
    myViewController * wfc = [[myViewController alloc]init];
    [wfc observeSpeakerVolume];
}

似乎可以正常工作,然而,在后台和前台之间来回切换几次,最终改变iPhone的音量会使应用程序崩溃。

我尝试在进入后台时手动删除观察者,但这也会导致应用程序崩溃,支持操作系统在进入后台时自动删除观察者的建议。

所以,我假设,我多次添加观察者,但我没有看到,因为当应用程序进入前景时未调用ViewDidLoad。

我的逻辑在这里出了什么问题?

感谢您的见解。

1 个答案:

答案 0 :(得分:0)

有点晚,但是我有类似的问题。

如果您致电

    [[AVAudioSession sharedInstance] setActive:YES error:nil];

您的应用从后台返回后,例如在

- (void)applicationWillEnterForeground:(UIApplication *)application;

然后观察者将再次工作。