gpt4 book ai didi

ios - 如何延迟方法直到 NSData 在 NSUrlSession 中完成加载?

转载 作者:行者123 更新时间:2023-11-28 21:54:08 25 4
gpt4 key购买 nike

我正在做一个项目,我从一个方法调用另一个方法。在第二种方法中,我使用 NSURLSession 从服务器获取数据。当第二个方法将 NSData 返回给第一个方法时,数据被转换为 JSON,然后返回给对第一个方法进行初始调用的 View Controller 。我遇到的问题是第一个方法返回一个空对象,因为 NSData 加载速度不够快。我不知道该怎么办。

代码如下:

方法一

-(NSDictionary*)returnJsonDictionaryFromUrl:(NSURL*)url {

NSData *data = [self makeHttpRequestWithUrl:url];
//NSLog(@"Data is: %@", data);
NSError *error;

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions error:&error];


return json;

}

方法二

-(NSData*)makeHttpRequestWithUrl:(NSURL*)url {

if (!_data) {
_data = [[NSData alloc]init];
}

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {

_data = data;


}] resume];



return _data;
}

提前感谢您的任何建议!

最佳答案

所以默认情况下 block 在执行中被跳过并排队(有时在其他线程上)。这意味着当您返回刚刚在 block 中设置的变量时,您应该假设该 block 尚未执行,并且您在其中设置的任何变量直到很久以后才会被设置。

处理此问题的最佳方法是将完成 block 传递给该方法。因此,不是让它返回 NSData 指针,而是将其设为 void 并简单地将完成 block 传递给它。这将是您的请求方法:

-(void)makeHttpRequestWithUrl:(NSURL*)url completion:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completion {
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url
completionHandler:completion] resume];
}

你会这样调用它:

[object makeHttpRequestWithUrl:url completion:^(NSData *data, NSURLResponse *response, NSError *error) {
// handle error
// use data
}

关于ios - 如何延迟方法直到 NSData 在 NSUrlSession 中完成加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27200431/

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