iphone:在 NSURLRequest 期间未调用 applicationWillTerminate?

Posted

技术标签:

【中文标题】iphone:在 NSURLRequest 期间未调用 applicationWillTerminate?【英文标题】:iphone: applicationWillTerminate not called during a NSURLRequest? 【发布时间】:2010-03-01 14:02:04 【问题描述】:

我正在开发一个应用程序,用户在某些时候必须等待来自网络服务的正确响应。这可能需要一些时间,因为它需要来自 web 服务的手动确认。因此,请求的 timeoutInterval 设置得非常高,以防止它过早终止。

在程序返回主屏幕后立即启动应用程序时出现问题。应用程序无法启动(黑屏),我认为是因为请求尚未释放,仍在等待响应(但我可能错了)。

我尝试了 applicationWillTerminate 方法,但在按下主页按钮时没有调用它。同样,这可能是因为应用程序仍在等待响应,但非常感谢您提供更好的解释:)

另外,有人知道该怎么做吗?

代码:

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlAdress]
                                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                      timeoutInterval:10000];

    NSHTTPURLResponse* response = nil;  
    NSError* error = nil; 

    NSData *responseData = [NSURLConnection sendSynchronousRequest:theRequest   
                                                             returningResponse:&response   
                                                                         error:&error]; 

【问题讨论】:

【参考方案1】:

在主线程上发出同步请求会阻塞整个运行循环,直到收到响应或请求超时。在此期间不会调用任何内容,包括 applicationWillTerminate。这样做是一个非常糟糕的主意。您应该为请求分离一个单独的线程或创建一个异步 NSURLConnection。

话虽如此,操作系统在终止您的应用程序时无论如何都会释放所有内存,因此上次启动的任何内容在重新启动时“剩余”的可能性很小。除非您的服务器因为在您的应用程序终止时丢失了客户端而被阻止。在这种情况下,您必须以可以处理这种情况的方式编写服务器,因为它可能随时发生。

【讨论】:

你是对的,这样做是一件坏事:P 我不得不在服务器上重写我的代码.. 感谢您的回复 :)【参考方案2】:

如果 applicationWillTerminate 委托方法没有被调用,

那么我猜下面的委托方法会被调用。

- (void)applicationWillResignActive:(UIApplication *)application

  NSLog(@"Application Did Resign Active");

【讨论】:

以上是关于iphone:在 NSURLRequest 期间未调用 applicationWillTerminate?的主要内容,如果未能解决你的问题,请参考以下文章

NSURLRequest 自动释放:崩溃

是否可以防止 NSURLRequest 在请求后缓存数据或删除缓存的数据?

iPhone - 未找到 stdint.h 文件!

iPhone/iOS 状态栏未隐藏在 Xcode 项目中

iPhone:NSURLRequestCachePolicy 设置之间的性能差异

网络在模拟器上工作不适用于 iPhone 设备