9

我的应用程序中的所有服务器连接都以相同的方式进行:

  • dispatch_async 到第二个线程。
  • 发送同步请求
  • 主线程上的失败/成功块。

  • 以下不是完整的代码,只是概念:

    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. 将应用程序发送到 BG。
  2. 等一会...
  3. 该应用程序被iOS杀死。
  4. 再次打开,iOS 从头开始​​加载整个应用程序。(请参阅启动屏幕,然后是第一个屏幕,而不是我留给 BG 的那个..)

在那种情况下,我得到 NSURLConnectionErrors!样样都有!代码 1003、代码 1009、代码 9……只要说出它的名字!我收到应用程序加载时立即启动的所有服务器连接的错误。之后的任何其他连接都可以正常工作!包括那些失败的刷新!

几乎感觉我试图太快或太早地到达我的服务器,我确实在启动连接之前检查并通过了可达性测试。

真的可以在这里使用一些帮助。 提前致谢。

更新:如下所示,尝试使用sendAsynchronousRequest - 给了我完全相同的行为。(错误:这次是 1001)。

4

2 回答 2

4

好的,我知道了!appDelegate 构建了 tabBar,它加载了所有 viewController,发送了一些 NSURLConnections ...... (不知道第一次启动是可以的,只有在应用程序杀死它之后才可以)

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

于 2012-12-26T17:01:15.640 回答
3

您应该查看使用此方法并异步发送数据

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

NSPertationQueue mainQueue 使用主线程,但是允许您在主线程上更新 UI,例如一个活动指示器。

于 2012-12-24T00:39:46.420 回答