异步 Api 在块外调用和返回数据
Asynchronously Api calls and returning data outside the block
我不明白为什么我在块代码之外得到空数组,即使我在我的数组上使用了 __block 关键字。
我使用以下代码
从后端 api 成功获取数据
`-(void)getJsonResponse:(NSString *)urlStr success:(void (^)(NSArray *responseDict))success failure:(void(^)(NSError* error))failure
{
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:urlStr];
// Asynchronously API is hit here
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// NSLog(@"%@",data);
if (error)
failure(error);
else {
NSArray *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
// NSLog(@"%@",json);
success(json);
}
}];
[dataTask resume]; // Executed First
}`
然后在我的函数中 returning 我正在使用的数据如下
`- (NSArray *)get_data:(NSDictionary *)credentials{
NSString *urlStr =[ NSString stringWithFormat:@"http://test.com %@",credentials];
__block NSArray *jsonArray= [[NSArray alloc]init];
[self getJsonResponse:urlStr success:^(NSArray *responseArray) {
jsonArray = responseArray;
NSLog(@"%@",responseArray);
} failure:^(NSError *error) {
// error handling here ...
}];
NSLog(@"%@",jsonArray);
return jsonArray;
}
`
这里的问题是虽然我在 getJsonResponse 块中成功获取数据,但是当我尝试 return 响应数据数组作为函数 return 时,我得到的 jsonArray 为空。我认为在 jsonArray 前面分配 __block 应该保留块代码中的数据分配?
第二种方法是不使用像下面这样的异步方式
`- (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
{
NSError __block *err = NULL;
NSData __block *data;
BOOL __block reqProcessed = false;
NSURLResponse __block *resp;
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable _data, NSURLResponse * _Nullable _response, NSError * _Nullable _error) {
resp = _response;
err = _error;
data = _data;
reqProcessed = true;
}] resume];
while (!reqProcessed) {
[NSThread sleepForTimeInterval:0];
}
*response = resp;
*error = err;
return data;
}`
这样它会在等待数据时阻塞主线程。
我建议对 get_data
函数使用与 getJsonResponse
相同的方法:
- (void)get_data:(NSDictionary *)credentials finish:(void(^)(NSArray *data))finish{
NSString *urlStr =[ NSString stringWithFormat:@"http://test.com %@",credentials];
__block NSArray *jsonArray= [[NSArray alloc]init];
[self getJsonResponse:urlStr success:^(NSArray *responseArray) {
jsonArray = responseArray;
if (finish) {
finish(jsonArray);
}
} failure:^(NSError *error) {
// error handling here ...
}];
}
我不明白为什么我在块代码之外得到空数组,即使我在我的数组上使用了 __block 关键字。
我使用以下代码
从后端 api 成功获取数据`-(void)getJsonResponse:(NSString *)urlStr success:(void (^)(NSArray *responseDict))success failure:(void(^)(NSError* error))failure
{
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:urlStr];
// Asynchronously API is hit here
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// NSLog(@"%@",data);
if (error)
failure(error);
else {
NSArray *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
// NSLog(@"%@",json);
success(json);
}
}];
[dataTask resume]; // Executed First
}`
然后在我的函数中 returning 我正在使用的数据如下
`- (NSArray *)get_data:(NSDictionary *)credentials{
NSString *urlStr =[ NSString stringWithFormat:@"http://test.com %@",credentials];
__block NSArray *jsonArray= [[NSArray alloc]init];
[self getJsonResponse:urlStr success:^(NSArray *responseArray) {
jsonArray = responseArray;
NSLog(@"%@",responseArray);
} failure:^(NSError *error) {
// error handling here ...
}];
NSLog(@"%@",jsonArray);
return jsonArray;
}
`
这里的问题是虽然我在 getJsonResponse 块中成功获取数据,但是当我尝试 return 响应数据数组作为函数 return 时,我得到的 jsonArray 为空。我认为在 jsonArray 前面分配 __block 应该保留块代码中的数据分配?
第二种方法是不使用像下面这样的异步方式
`- (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
{
NSError __block *err = NULL;
NSData __block *data;
BOOL __block reqProcessed = false;
NSURLResponse __block *resp;
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable _data, NSURLResponse * _Nullable _response, NSError * _Nullable _error) {
resp = _response;
err = _error;
data = _data;
reqProcessed = true;
}] resume];
while (!reqProcessed) {
[NSThread sleepForTimeInterval:0];
}
*response = resp;
*error = err;
return data;
}`
这样它会在等待数据时阻塞主线程。
我建议对 get_data
函数使用与 getJsonResponse
相同的方法:
- (void)get_data:(NSDictionary *)credentials finish:(void(^)(NSArray *data))finish{
NSString *urlStr =[ NSString stringWithFormat:@"http://test.com %@",credentials];
__block NSArray *jsonArray= [[NSArray alloc]init];
[self getJsonResponse:urlStr success:^(NSArray *responseArray) {
jsonArray = responseArray;
if (finish) {
finish(jsonArray);
}
} failure:^(NSError *error) {
// error handling here ...
}];
}