【发布时间】:2013-12-16 19:19:06
【问题描述】:
我目前正在开发的应用程序有一个非常奇怪的行为。每当我通过 XCode、iTunes 或 TestFlightApp 安装测试版本时,应用程序都会正常启动并且运行良好。这 当我手动终止应用程序并重新启动它时,问题就来了。然后显示启动图像,这是应用程序走得最远的地方 - 它只是冻结了一段时间,然后操作系统清除了整个过程。崩溃日志包含相当无用的信息,因为它指出 - 应用程序特定信息:未能及时启动。 管理器中的控制台还会记录以下内容:
- 注意:位置图标现在应该处于“非活动”状态
- 警告:com.. 未能及时启动
- 警告:强制 MyApp[7956] 报告崩溃...
- 警告:已完成崩溃报告。
- 注意:(UIKitApplication:com..[0x6a86]) 退出:杀死:9
- 注意:(UIKitApplication:com..[0x6a86]) 限制重生:将 从 2147483625 秒开始
- 警告:应用程序 'UIKitApplication:com..[0x6a86]' 已退出 信号 9 异常:杀死:9
我已经花了一整天的时间研究这个问题。澄清一下 - 任何同步工作或任何大量工作都不会在任何 UIApplication 委托方法上执行 (applicationDidBecomeActive、didFinishLaunchingWithOptions 等)。 我注意到的是,如果在执行期间未执行任何 URL 请求,则根本不会发生问题,即应用程序在此之前被杀死后第二次正常运行。 顺便提一下,这个问题出现在 iOS 7 下,但该应用也支持 iOS 5 和 6。
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue currentQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){if (nil == error) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
(...)//creating ppError
if (nil == ppError) {
result = parsing(json, &ppError);
if (nil != ppError) {
result = nil;
}
}
dispatch_async(dispatch_get_current_queue(), ^{
if (PPServiceReturnedInvalidTokenErrorCode == ppError.code) {
(...)//do some parsing stuff
[[NSNotificationCenter defaultCenter] postNotificationName:PPRequestManagerUserAuthenticationTokenDidExprireNotification
object:self
userInfo:userInfo];
}
completion(result, ppError);
});
});
}
else {
completion(nil, ppError);
}
}];
这基本上就是所有请求的发出方式,所以我认为一切都是正确的,但事实是,如果我评论这段代码,所描述的问题就会消失。
任何建议和想法将不胜感激。谢谢!
【问题讨论】:
-
使用工具来查看应用程序的功能以及它在代码中的哪个位置消耗了这么多时间。通常,如果主线程被阻塞并且应用程序在启动时需要超过 10 秒才能获得响应,就会发生这种情况。
-
在您的完成处理程序中,第二个 dispatch_async(),您的意思是分派到当前队列吗?因为那不会做任何事情,根据定义,您已经在当前队列中
-
当前队列上的 @PatrickGoley
dispatch_async将代码打乱到至少下一个运行循环。所以它做了“某事”。这种 shuffle 的副作用之一是当前 runloop 完成并告诉 SpringBoard 该应用程序已及时启动。 -
崩溃日志应该显示您从内存中删除时发生的事情的堆栈跟踪,特别是主线程的跟踪。
标签: ios iphone objective-c nsurlconnection xcode5