我正在创建iphone应用。 在那里,当应用程序启动时,它连接到服务器并下载少量图像,然后继续应用程序。当应用程序下载时,它将显示初始启动画面。只要我的服务器能够ping我的iphone,它运行良好。 但是当我的服务器花了很多时间来响应NSURL请求时,麻烦就开始了。 该应用程序崩溃并出现以下错误:
Mon May 14 13:56:34 unknown Springboard[24] <Warning>: com.xxxx.xxx failed to launch in time
我明白当应用程序发生此类问题时,iphone会崩溃应用程序。我想知道iphone允许应用程序响应此类实例的最长时间。
是否有最大值?
答案 0 :(得分:1)
计时器大约是20-30秒,但这并不重要。
您正在同步下载数据。请使用NSURLConnection将程序更改为异步下载。您的应用程序看起来会更快,并且不会冒终止的风险。您还可以实现超时的错误处理。
答案 1 :(得分:0)
来自Apple's Reachability example上的Readme.txt:
Reachability样本演示 异步使用 SCNetworkReachability API。您可以使用 API同步,但不是 通过hostName发出同步检查 在主线程上。如果是设备 无法访问DNS服务器或在 慢速网络,同步呼叫 SCNetworkReachabilityGetFlags 功能可以阻止最多30个 秒试图解决 主机名。如果这发生在主要的 线程,应用程序看门狗将 20秒后杀死应用程序 不活动。
正如保罗所说,做任何类型的同步网络都是一个非常非常糟糕的主意。您需要在iPhone上异步加载。
答案 2 :(得分:0)
如果您的请求和响应操作在主线程中处理,则UI和主线程将被阻止,并且可能需要一些时间来接收响应。如果主线程在特定时间内被阻止,则WATCH DOG将退出您的应用程序。
更好的解决方案是在后台线程或其他线程中运行您的请求。
例如
if(!backgroundQueue)
backgroundQueue=[[NSOperationQueue alloc]init];
NSURLRequest *request=[[NSURLRequest alloc]initWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLCacheStorageNotAllowed
timeoutInterval:60];
[NSURLConnection sendAsynchronousRequest:request
queue:backgroundQueue
completionHandler:^(NSURLResponse *response,NSData *data,NSError *error) {
if (complete) {
// handle your logic here
}
}];
此操作在后台线程
中处理