gpt4 book ai didi

ios - 无法使用带有 GCD 的 NSURLConnection 获取数据

转载 作者:行者123 更新时间:2023-12-01 19:07:03 24 4
gpt4 key购买 nike

所以我正在将一些数据从服务器下载到我的 ios 客户端。数据需要格式化,所以我使用 NSNotification 在数据完全下载时通知应用程序,完成后,我格式化数据,然后将其显示在屏幕上。
这一切都很酷,但是由于数据的大小,屏幕卡住了。我想我应该使用 GCD 将数据下载推送到另一个线程,这样 UI 仍然可以响应。当我这样做时,我似乎没有下载任何数据。
我有一个方法getTops使用 NSURLConnection下载数据。最初,在我的 viewDidLoad我调用了这个方法,它工作得很好,但后来我像这样使用了 GCD

dispatch_queue_t getItemsQ = dispatch_queue_create("get Items", NULL);
dispatch_async(getItemsQ, ^{
[self getTops];
});

它停止工作。我知道它会到达 getTops因为我可以在控制台中看到日志,但它永远不会到达 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
这是我使用的代码:
-(void)getTops{
Keychain *keychain = [[Keychain alloc]init];
NSString *auth_token = [keychain getAuthToken];
NSLog(@"at getTops");
topimageArray = [[NSMutableArray alloc]init];
NSURLConnection *connection;

webData = [[NSMutableData alloc]init];
NSURL *url = [[NSURL alloc]initWithString:base];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
[request setURL: url];
[request setValue:auth_token forHTTPHeaderField:@"X-AUTH-TOKEN"];
connection = [NSURLConnection connectionWithRequest:request delegate:self];
// [connection start];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSLog(@"at getTops conn start");
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"recieved response");
[webData setLength:0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
if(data) {
NSLog(@"Appending data");
[webData appendData:data];
}
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSArray *response= [NSJSONSerialization JSONObjectWithData:webData options:0 error:nil];
NSLog(@"Tops full response::: %@",response);
theArray = [[NSArray alloc]initWithArray:response];
NSLog(@"DONE");
//Notify that the data is ready to be formated
[[NSNotificationCenter defaultCenter]postNotificationName:@"getTops" object:nil];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"error::::%@", error);
NSString *errormsg = error.localizedDescription;
UIAlertView *alertview = [[UIAlertView alloc]initWithTitle:@"Error" message:errormsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alertview show];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

我想也许我应该删除 [UIApplication sharedApplication].networkActivityIndicatorVisible但这没有帮助

编辑::添加 NSLogs 到委托(delegate)方法。
我得到的日志是
at getTops conn start

就是这样。

最佳答案

最简单的方法是使用 sendAsynchronousRequest:queue:completionHandler:。不需要委托(delegate),只需将来自 connectionDidFinishLoading: 的代码放在完成 block 中。

加载 URL 请求的数据并在请求完成或失败时在操作队列上执行处理程序 block 。

[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
< your code >
}];

关于ios - 无法使用带有 GCD 的 NSURLConnection 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19048274/

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