iOS Objective-C AFNetworking dataTaskWithRequest:completionHandler:无法从完成块内部检索数据
Posted
技术标签:
【中文标题】iOS Objective-C AFNetworking dataTaskWithRequest:completionHandler:无法从完成块内部检索数据【英文标题】:iOS Objective-C AFNetworking dataTaskWithRequest:completionHandler: can't retrieve data from inside completition block 【发布时间】:2015-03-10 16:20:20 【问题描述】:这是我的代码:
//create array with all the teams
NSMutableArray *leagueTeams = [[NSMutableArray alloc] init];
//send request
[[sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error)
NSDictionary *responseFromJSONDictionary = (NSDictionary *) responseObject;
//copy the team's attributes into temp variables
NSString *tempTeamIDCode = [responseFromJSONDictionary objectForKey:@"teamCode"];
NSString *tempTeamName = [responseFromJSONDictionary objectForKey:@"teamName"];
NSInteger tempTeamPoints = [(NSNumber *) [responseFromJSONDictionary objectForKey:@"teamPoints"] integerValue];
//use temp variables to create a temporary team
Team *aTeam = [[Team alloc] initWithTeamIdCode:tempTeamIDCode andTeamName:tempTeamName andLeaguePoints:tempTeamPoints];
//add team to array
[leagueTeams addObject:[aTeam copy]];
]resume];
我正在尝试制作一个从服务器检索 JSON 数据的应用程序。现在我使用静态 JSON 来检索条目。我使用断点来跟踪变量值。应用成功检索 JSON 数据,成功创建 3 个临时变量并成功创建团队对象并成功将对象添加到 leageTeams mutablearray,同时位于成功代码块内。
但是,应用程序离开成功块的那一刻,leagueTeams 数组就消失了。即使是空数组,它也不存在于内存中,就像在执行成功块之前一样。
尝试将数据传递给代码块内的外部变量时,我可能做错了什么,但是所有其他类似的问题都无法及时从服务器获取数据,但在我的情况下,数据请求总是成功的,并且 JSON 响应并将其转换为 NSDIctionary 都可以正常工作....所以任何人都可以帮忙吗?谢谢
【问题讨论】:
将__block
添加到数组的定义中,并且在将 aTeam 回调添加到主线程时添加到完成块中。 [NSoperationQueue mainQueue] addOperationBlock:
【参考方案1】:
好吧,“dataTaskWithRequest:completionHandler:”方法是异步的!一旦它开始程序执行就不会等待它返回值,它会继续到它之外的下一行。因此,您在此方法下方编写的代码可能比完成处理程序中的代码首先执行。所以你可以做的是在完成处理程序返回所需的值后触发通知或调用一些委托方法来运行任何代码。
【讨论】:
通过通知中心完成并重新加载表格。谢谢以上是关于iOS Objective-C AFNetworking dataTaskWithRequest:completionHandler:无法从完成块内部检索数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 AFNetwork 在 iOS 应用程序中续订 SSL 证书后的 NSURLErrorDomain