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响应。它只是导致这个“块”的第一次加载。
我想我发现了这个问题,我在一个异步GCD线程上执行同步请求,出于某种原因超时正在发生,但只在iOS 4的请求中,可能标头与iOS 4稍有不同导致API花更长的时间来回应?或者,在异步线程中同步发送来自不同线程的多个请求(如同时发生的毫秒)请求在发送之前会在系统中发生冲突?
不管怎样...这似乎并没有这样的情况叫google.com,甚至我自己的私人服务器,所以它必须是与头和多个请求......
我使用来自github的asi http,它的工作效率更高,现在我不使用GCD来处理这些请求,只是一个ASI队列。
有关iOS 4同步请求在异步GCD线程上执行的任何最终想法,可能的超时不受尊重并提前返回状态204?
好的 - 如果是https,那么你可能无法脱身使用sendSynchronousRequest
。该文件指出,之类的东西[NSURLConnection connection:didReceiveAuthenticationChallenge:]
不会调用一些关键的东西,即:
如果认证是为了下载请求所需,所需要的凭据必须被指定为URL的一部分。如果身份验证失败或凭据丢失,则连接将尝试继续,而无需凭据。
说实话,我仍然很惊讶它在iOS5上工作。我认为你必须使用异步方法来至少调试它以查明发生了什么。
是否有任何不寻常的iOS日志语句可以看到?根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html,204响应中的响应数据中不能包含任何内容。你是否控制它连接的服务器?那里有不同的日志吗? – 2012-03-23 13:10:24
另外 - sendSynchronousRequest在处理https方面确实有局限性,通常你可以通过使用委托异步获得更多信息(以复杂性为代价)。这些http或https? – 2012-03-23 13:12:16
嗨,它的HTTPS,我不控制服务器不幸的是,似乎如果我从应用程序委托或一个不同的类调用我的函数它会很好,但不是从我的表格视图,这是在导航控制器,是什么我正在执行此操作的上下文有点奇怪...... – Daniel 2012-03-23 15:15:17