2

这是我第一次使用 KVO,我马上就卡住了。问题是,当调用 observeValueForKeyPath 时,我正在调用同一个类中的另一个方法。该方法只是显示一个警报视图。我认为简单的事情,但警报视图不显示。

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                     change:(NSDictionary *)change context:(void *)context
{
    [self beginUpdate];
}


 -(void)beginUpdate
 {
     NSLog(@"Check!");
     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"message" message:@"Hi" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
     [alert show];
 } 

显示日志消息。仅当我从observeValueForKeyPath 以外的任何其他方法调用它时,才会显示警报消息。

4

1 回答 1

5

据我所知,observeValueForKeyPath:在修改观察对象的线程的上下文中调用。另一方面,对 UI 的更改只能在主线程上完成。尝试

dispatch_async(dispatch_get_main_queue(), ^{
    [self beginUpdate];
});

或者

[self performSelectorOnMainThread:@selector(beginUpdate) withObject:nil waitUntilDone:NO]

以确保UIAlertView在主线程上创建。

于 2012-07-23T19:24:59.427 回答