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 在请求后缓存数据或删除缓存的数据?