iOS上的GCD网络请求失败4

问题描述:

我的应用程序中有以下代码,用于从我的API加载一些数据。它工作正常,事实上在iOS 5中很好,但在iOS 4上,我收到很多状态为204的响应。iOS上的GCD网络请求失败4

这只发生在iOS 4上,这可能被视为API错误,但它的工作原理很好浏览器,Rested.app,iOS 5等...只有iOS 4失败,它在模拟器和设备(iPhone 4)上失败。

我每次将一个单元格加载到表视图中时都会调用此代码。我有一个带有加载状态的核心数据对象,如果它没有被加载,那么最初设置为no。我执行这个代码,如果它被加载,我跳过这段代码。与此同时,我在桌子视图的单元格内显示一个微调框。

我相信它与在iOS 4

在GCD多个请求的问题任何人都可以点什么毛病我的代码片段?

-(void)myFunction{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     // query users participations (Network) 

     NSError * _urlError = nil; 
     NSString * url = [NSString stringWithFormat:@"my api url"]; 
     NSMutableURLRequest * loginHTTPRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; 
     [loginHTTPRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 

     NSLog(@"Description: %@", [loginHTTPRequest description]); 

     NSHTTPURLResponse * _responseHeaders = nil; 
     NSData    * responseData  = [NSURLConnection sendSynchronousRequest:loginHTTPRequest 
                     returningResponse:&_responseHeaders 
                        error:&_urlError]; 
     if(_urlError != nil){ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       // alert network connection error 
      }); 
      return; 
     } 

     NSString *json_string = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

     SBJsonParser *parser = [[SBJsonParser alloc] init]; 
     NSDictionary * jsonData = [NSDictionary dictionaryWithDictionary:[parser objectWithString:json_string]]; 
     [json_string release]; 
     [parser release]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      // here [_responseHeaders statusCode] keeps returning 204 and there is nothing in responseData 

      // do some Core Data stuff 
     }); 

    }); 
} 

UPDATE

注意,如果连一个for循环反复调用这个代码工作正常,问题是,当我援引的tableView这个方法:的cellForRowAtIndexPath:

我有核心数据带有属性“isLoaded”的对象设置为NO,并在远程加载时将其更改为YES。当我的tableview的数据源为每个对象加载单元格时,如果对象的“isLoaded”属性为NO,tableView:cellForRowAtIndexPath:方法将调用此函数。

我怀疑问题可能是因为有两个或两个以上的同时调用API发生在表加载和重新加载时。每个来自api的成功加载都会为该tableview调用reloadData。

这让我有一个预先填充的旋转器tableview和异步加载在我的数据,因为我需要它在屏幕上,这是很好,因为我可以有效地使用NSFetchedResultsController与惰性加载我的对象的核心数据。我有一个端点为所有我的对象返回一个对象id的数组 - 我创建的核心数据对象只有ID的,所有其余的数据,名称,日期等等等不会加载,直到它需要) 。

当我开始滚动创建/重用的新单元时,调用此方法,并且它们始终会获得数据的200响应。它只是导致这个“块”的第一次加载。

+0

是否有任何不寻常的iOS日志语句可以看到?根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html,204响应中的响应数据中不能包含任何内容。你是否控制它连接的服务器?那里有不同的日志吗? – 2012-03-23 13:10:24

+0

另外 - sendSynchronousRequest在处理https方面确实有局限性,通常你可以通过使用委托异步获得更多信息(以复杂性为代价)。这些http或https? – 2012-03-23 13:12:16

+0

嗨,它的HTTPS,我不控制服务器不幸的是,似乎如果我从应用程序委托或一个不同的类调用我的函数它会很好,但不是从我的表格视图,这是在导航控制器,是什么我正在执行此操作的上下文有点奇怪...... – Daniel 2012-03-23 15:15:17

我想我发现了这个问题,我在一个异步GCD线程上执行同步请求,出于某种原因超时正在发生,但只在iOS 4的请求中,可能标头与iOS 4稍有不同导致API花更长的时间来回应?或者,在异步线程中同步发送来自不同线程的多个请求(如同时发生的毫秒)请求在发送之前会在系统中发生冲突?

不管怎样...这似乎并没有这样的情况叫google.com,甚至我自己的私人服务器,所以它必须是与头和多个请求......

我使用来自github的asi http,它的工作效率更高,现在我不使用GCD来处理这些请求,只是一个ASI队列。

有关iOS 4同步请求在异步GCD线程上执行的任何最终想法,可能的超时不受尊重并提前返回状态204?

好的 - 如果是https,那么你可能无法脱身使用sendSynchronousRequest。该文件指出,之类的东西[NSURLConnection connection:didReceiveAuthenticationChallenge:]不会调用一些关键的东西,即:

如果认证是为了下载请求所需,所需要的凭据必须被指定为URL的一部分。如果身份验证失败或凭据丢失,则连接将尝试继续,而无需凭据。

说实话,我仍然很惊讶它在iOS5上工作。我认为你必须使用异步方法来至少调试它以查明发生了什么。

+0

我只需要在某些API端点上提供基本身份验证,但所有http都重定向到https,造成问题的一个是没有额外头文件的GET端点。 – Daniel 2012-03-23 16:51:08

+0

如果原因是iOS4没有像iOS5一样处理异步期望,则需要移到异步方法来证明它。 – 2012-03-24 00:52:33

+0

嗨,感谢您的反馈,我真的不认为这是一个问题,我试图在另一个测试应用程序中重新创建此问题,但我不能,也用更多的细节更新了问题,这是一个非常特殊问题,欢迎任何帮助和想法... – Daniel 2012-03-24 21:53:24