iOS应用程序被终止后,NSURLConnection的sendSynchronousRequest/sendAsynchronousRequest方法失败

9
我的应用程序中所有与服务器的连接都是相同的:
  • dispatch_async to a 2nd thread.
  • sendSynchronousRequest
  • fail/success blocks on main thread.

  • The following is not the full code, just the concept:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *url = [NSURL URLWithString:@"someURL"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        NSURLResponse *response = nil;
        NSError *error;
        NSData *data = [NSURLConnection sendSynchronousRequest:request
                                                 returningResponse:&response
                                                             error:&error];
       if (error)
       {
          dispatch_async(dispatch_get_main_queue(), ^{ _failureBlock(error); });
       }
       else
       {
          dispatch_async(dispatch_get_main_queue(), ^{ _successBlock(data); });
       });
    

这个应用程序非常好用!我可以用它连接数千台服务器,并且每次启动应用程序时都能正常运行。

问题出现在以下情况:

  1. 将应用程序发送到后台。
  2. 等待一段时间...
  3. iOS终止了应用程序。
  4. 再次打开应用程序时,iOS会完全重新加载整个应用程序。 (看到启动画面,然后是第一个屏幕,而不是我离开时的屏幕。)

在这种情况下,我会遇到NSURLConnectionErrors!!各种各样的错误!代码1003、代码1009、代码9...什么都有!我会得到所有从应用程序启动开始的服务器连接错误。之后的任何其他连接都正常工作!包括刷新失败的那些连接!

这几乎感觉像是我尝试过早或过快地访问我的服务器,但是在发起连接之前,我确实检查并通过了可达性测试。

真的需要一些帮助。 提前致谢。

更新:如下所建议,尝试使用sendAsynchronousRequest - 但出现了完全相同的行为。(这次是err:1001)

2个回答

4

好的,我知道了! appDelegate 构建了 tabBar,加载了所有视图控制器,它们发送了一些 NSURLConnections... 但是对于 iOS 来说等待响应时间太长,导致所有请求都失败了! (不知道为什么第一次启动没有问题,只有在 app 被杀死后才出现问题)

无论如何,我将所有服务器负载更改为使用带有 0.1 延迟的 selector 执行。这样 appDelegate 就能完成运行,一切都很好! :)


1
添加延迟有点不可靠,是最后的手段。考虑使用NSNotifications来告诉代码的其他部分在某些操作完成后该做什么。 - BlueFish

3
你应该考虑使用这种方法,并异步地发送数据。
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

NSOperationQueue的mainQueue使用主线程,但也允许您在主线程上更新UI,例如活动指示器。

会尝试并更新!(如果需要一些时间很抱歉。这是一个难以重现的问题,如果它能够解决将更加困难)十分感谢! - Mute Dan
更新:sendAsynchronousRequest - 不好。给了我完全相同的行为(这次是错误代码1001)。:( - Mute Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接