Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:键值观察不会关闭模式视图_Ios_Objective C_Key Value Observing - Fatal编程技术网

iOS:键值观察不会关闭模式视图

iOS:键值观察不会关闭模式视图,ios,objective-c,key-value-observing,Ios,Objective C,Key Value Observing,在模态视图中,我有以下关键值观察者方法: - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"uploadComplete"]) { NSLog(@"UploadVC hears upload complete");

在模态视图中,我有以下关键值观察者方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
  if ([keyPath isEqualToString:@"uploadComplete"]) {
    NSLog(@"UploadVC hears upload complete");
    [self dismissViewControllerAnimated:YES completion:nil];
  }
}
我用它来观看照片对象,并知道它何时完成上传。当我运行此命令时,它的行为与预期的一样,控制台记录UploadVC听到upload complete(上传完成),但随后没有执行下面的一行,模式不会被取消


没有错误或其他任何东西,视图就在那里,模态永远不会被忽略。这里发生了什么?

当您在后台线程上收到KVO通知时,可能会发生这种情况,因此尝试更新UI可能会导致任何意外行为,如UI未更改、延迟后更改、应用程序崩溃等。请确保调用主线程上的所有更新UI代码:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
  if ([keyPath isEqualToString:@"uploadComplete"]) {
     NSLog(@"UploadVC hears upload complete");
     dispatch_async(dispatch_get_main_queue(), ^{
         [self dismissViewControllerAnimated:YES completion:nil];
     });

  }
}

当您在后台线程上收到KVO通知时,可能会发生这种情况,因此尝试更新UI可能会导致任何意外行为—UI未更改、延迟后更改、应用程序崩溃等。请确保调用主线程上的所有更新UI代码:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
  if ([keyPath isEqualToString:@"uploadComplete"]) {
     NSLog(@"UploadVC hears upload complete");
     dispatch_async(dispatch_get_main_queue(), ^{
         [self dismissViewControllerAnimated:YES completion:nil];
     });

  }
}

您能否显示出现问题的视图控制器的代码?听起来它可能被推到导航堆栈上,而不是以模式显示。它是以模式显示的,在调用控制器中[self-presentViewController:uploadViewController animated:YES completion:nil];您能否显示出现问题的视图控制器的代码?听起来它可能被推到导航堆栈上,而不是以模式显示。它是以模式显示的,在调用控制器中[self-presentViewController:uploadViewController animated:YES completion:nil];好了。后续问题:如何知道何时从后台线程调用方法?我如何预测未来的这种行为?和-什么是dispatch\u async?对不起,我是iOS的新手!感谢您的帮助。基本上,如果您不能确定可以调用哪个线程方法,您应该编写防御代码,并确保您将在主线程上更新UI。dispatch_async是一种在任意调度队列上异步执行块的方法,这里我们使用的主队列与在主线程上执行块基本相同。你可以在这里看到更多关于这一切的信息。后续问题:如何知道何时从后台线程调用方法?我如何预测未来的这种行为?和-什么是dispatch\u async?对不起,我是iOS的新手!感谢您的帮助。基本上,如果您不能确定可以调用哪个线程方法,您应该编写防御代码,并确保您将在主线程上更新UI。dispatch_async是一种在任意调度队列上异步执行块的方法,这里我们使用的主队列与在主线程上执行块基本相同。你可以在这里读到更多关于这些的内容