ios - __block 变量在方法调用时返回 nil
问题描述
我有一个方法,它具有块字符串变量,该变量被传递以检索块函数内的 API 数据。但是它返回零。在调试时,addressPlace 的值为零。
- (NSString *)getAddressForPlaceAPI:(double)latitudePassed longitude:(double)longitudePassed
{
__block NSString * addressPlace = nil;
NSString *url = @"";
url = [NSString stringWithFormat:@"%@lat=%@&lng=%@",kGeoCodeURL, [NSString stringWithFormat:@"%f",latitudePassed],[NSString stringWithFormat:@"%f", longitudePassed]];
[WebServiceObj callWebServiceGET_withAPIName:url withParam:nil withCompletion:^(BOOL isSuceess, NSDictionary *response)
{
if(isSuceess)
{
addressPlace = [[response valueForKey:KEY_RESULTS][0] valueForKey:KEY_FORMATTEDADDRESS];
NSLog(@"ADDRESSPP*** = %@",addressPlace);
}
else
{
NSLog(@"FAIL API = %s","FAIL");
}
}];
return addressPlace;
}
关于为什么会发生这种情况的任何想法?提前致谢。
解决方案
原因是方法callWebServiceGET_withAPIName
以异步方式工作。因此,在它返回完成处理程序之前,您的代码将到达函数的末尾,并将 addressPlace 作为 nil 返回。
为了解决这个问题,您还应该在方法的参数中传递一个块getAddressForPlaceAPI
。因此,每当您的成功块执行一次callWebServiceGET_withAPIName
返回值时,您都可以将值扔回父块。
推荐阅读
- date - 如何获取dll文件的编译日期?
- arraylist - 如何使用java8将对象列表取消组合为另一个对象的列表
- boolean - 当布尔运算符总是排除单个值,而根据逻辑应该包含它时,如何解决它?
- autodesk-forge - Autodesk Forge 数据管理参考 API 未列出 Revit 参考
- java - sorter.setRowFilter 方法无法正常工作
- asp.net-core - 如何从 Web 应用程序容器外部注入 SignalR Hub
- firebase - 带有自定义错误消息和状态代码的 Firestore 安全规则
- python - Airflow 中是否有操作员可以根据 BigQuery 中的查询创建表?
- mongodb - MongoDB 的自定义 ID 生成器不起作用
- python - 如何添加一个 DataFrame 列,该列由来自 2 个不同 DataFrame 的另一列的总和组成