杀死所有视图/控制器并默认为主页按钮上的登录页面不适用于 Web 服务调用

Posted

技术标签:

【中文标题】杀死所有视图/控制器并默认为主页按钮上的登录页面不适用于 Web 服务调用【英文标题】:Kill all views/controllers and default to Login page on home button not working for web service calls 【发布时间】:2013-12-12 16:38:30 【问题描述】:

我有一个 LOGIN 视图,它是根视图控制器。用户登录后以及在应用程序期间的任何时间,如果他单击主页按钮,我会使用以下方法删除所有可能的子视图: [view removeFromSuperview] 递归,这样我就可以杀死所有视图。我什至使用 [controller removeFromParentViewController]

然而,如果当我们点击 iphone 主页按钮时,任何 web 服务调用正在运行,即使所有视图和控制器都被移除,来自 web 服务的响应由应用程序处理,并且由于 Push segue 被调用。如何在 AppDelegate 的应用程序中终止任何现有的 Web 服务调用?错误 " 找不到 segue "XXsearch" 的导航控制器。 这个错误显然是因为我删除了所有控制器和视图。

但是为什么 Web 服务响应仍然得到处理?还有另一种方法可以终止 Web 服务调用吗?

Web 服务调用是异步的。但是为什么控制器仍然存在来处理响应?

这是网络服务调用:

[NSURLConnection connectionWithRequest:NSMutableURLRequestObject delegate:self];

这是控制器中的代码,它是 Web 服务的委托:

 -(void)connectionDidFinishLoading:(NSURLConnection *)connection 
         // 对响应对象做一些事情
         [self performSegueWithIdentifier:@"XXsearch" sender:self];
    

【问题讨论】:

你能发布你的网络请求代码吗?否则任何答案都只是猜测。 @Clever 错误:刚刚添加了代码 【参考方案1】:

根据connectionWithRequest:delegate:的文档

在下载期间,连接保持对委托的强引用。当连接完成加载、失败或被取消时,它会释放该强引用。

这意味着即使您正在移除视图控制器,NSURLConnection 也会强制它保留。首先,您需要将连接保存在视图控制器的属性中。

self.connection = [NSURLConnection connectionWithRequest:NSMutableURLRequestObject delegate:self];

然后,当您的视图控制器从其父视图控制器中移除时,您需要确保取消连接并将其设置为 nil。

- (void)didMoveToParentViewController:(UIViewController *)parent

    [super didMoveToParentViewController:parent];
    if (!parent && self.connection) 
        [self.connection cancel];
        [self setConnection:nil];
    

此外,您需要确保在连接完成或失败时将连接设置为 nil。

【讨论】:

这解释了很多行为。谢谢你。为什么将连接设置为零? 只是为了清理。取消连接后,您将不再使用该对象。

以上是关于杀死所有视图/控制器并默认为主页按钮上的登录页面不适用于 Web 服务调用的主要内容,如果未能解决你的问题,请参考以下文章

xcode 从登录重定向到带有 uinavigation 的视图控制器

覆盖ios后退按钮

无法连接页面视图控制器上的按钮并使用按钮滑动到下一个屏幕

如何在离子中刷新视图

UIPageViewController 页面控件太靠近 iPhone X iOS 11 上的主页栏

我可以从 cakephp 中的视图重定向吗