gpt4 book ai didi

iphone - NSURLConnection 异步间歇性地返回 null

转载 作者:行者123 更新时间:2023-11-29 10:58:45 27 4
gpt4 key购买 nike

考虑到以下代码,我将我的应用程序从同步调用移至异步调用以停止 UI 卡住。 -- 除了一些小细节外,一切正常。

当是同步调用时,它们总是返回一个值(即使花费很长时间(5 或 6 秒))但是现在:

  1. ASync 调用有时非常快,有时需要 8 或 9 秒(我也有光纤互联网)

  2. 他们正在获取的文本数据有时似乎没有返回,或者他们超时,因为 myLabel 文本最终设置为“NULL”——我知道这不是我正在使用 API 的网站,因为它始终为 Sync 调用和在浏览器中返回一个值。

有什么想法吗?谢谢!

编辑:来自日志的错误响应是:响应:错误:(空)

[NSURLConnection sendAsynchronousRequest:requestGBP queue:operationQueue completionHandler: ^(NSURLResponse* response, NSData* data, NSError* error)
{
responseGBP = data;
NSString *json_stringGBP = [[NSString alloc] initWithData:responseGBP encoding:NSASCIIStringEncoding];
self.feedGBP = [parser objectWithString:json_stringGBP error:nil];


NSString *GBP = [NSString stringWithFormat:@"Info Last: %@" feedGBP ObjectForKey:@"value"]];

[myLabel setText:GBP];


}];

EDIIT::我还看到在日志窗口中打印了很多“应该无法到达这里”?!它不是我的 NSLog 代码的一部分!

最佳答案

取决于您的队列,您如何以及在哪里初始化您的 operationQueue ?更重要的是你什么时候调用异步连接?

如果您从一个动画的 UIView 中调用它们,例如 tableView 或 scrollView,当 table/scrollView 滚动时队列将以这种方式运行。

为了还能够调试更多信息,您需要 NSLog(@"Response: %@\r\nError: %@", response, error)

但根据我的经验,我高度怀疑第一种情况导致了这种情况,您也可以尝试使用默认队列而不是您自己的队列,像这样(不推荐,但可能有助于调试):

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

编辑 1:添加简单的代码更改以使事情变得更容易

所以正如我所怀疑的那样,您是从动画 View 中触发调用,这有时会导致延迟,我要做的是将 aSync 连接恢复为 Sync 连接,而是在后台线程上调用它们。

事情应该是这样的(未经测试的代码,可能包含错误或需要一些调整)

将您的调用转移到一个新方法中,将其称为 performRequest:(URLRequest*)req;

-(void)performRequest:(URLRequest*)aRequest{

NSError *err;
NSURLResponse *response;
NSData *returnData;

returnData = [NSURLConnection sendSynchronousRequest:aRequest
returningResponse:&response
error:&err];

if(!err && nil != returnData){
//Perform action with your data here
//IMPORTANT: if you have to use the data to update the UI again, then you
//Must perform that on the main thread, this code will always be called in the
//background thread, to do that simply do a call using GCD on the main Queue, like this

dispatch_async(dispatch_get_main_queue(), ^{
//Do only your UI updates here
});

}else{
NSLog(@"An error has occurred: %@", err);
}

每当你需要执行网络请求时,(从你的动画中,等等)你只需在后台线程中调用它,就像这样

//Place this right after you create your requestGBP request
[self performSelectorInBackground:@selector(performRequest:) withObject:requestGBP];

以这种方式尝试一下,让我知道适合您的情况!

关于iphone - NSURLConnection 异步间歇性地返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17053572/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com