gpt4 book ai didi

ios - AFNetworking 数组在 block 内返回 JSON,但不在 block 外

转载 作者:行者123 更新时间:2023-12-01 17:53:54 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





AFJSONRequestOperation array populates but cannot NSLog contents outside of success block

(1 个回答)


8年前关闭。




我创建了一个使用 AFNetworking API 返回 JSON 数据的自定义方法。

我正在尝试将从我的网络服务中提取的数据作为 JSON 存储在一个数组中。 NSLog(@"%@", json); block 内将 JSON 数据打印到控制台。 block 外 NSLog(@"%@", json);返回空值。为什么会这样,如何解决?

我想要做的是让方法返回 JSON 数据(NSArray)

#import "WebService.h"
#import "AFNetworking.h"
#import "MBProgressHUD.h"

@implementation WebService

- (NSArray *)postRequest:(NSDictionary *)postParameters {

//MBProgressHUD *progressHUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
//progressHUD.labelText = @"Loading";

__block NSArray *json;

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:@"http://192.168.0.100/app.php" parameters:postParameters success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSString *responseString = [operation responseString];

NSError *error;

json = [NSJSONSerialization
JSONObjectWithData:[responseString dataUsingEncoding:NSUTF8StringEncoding]
options:kNilOptions
error:&error];

NSLog(@"%@", json); // RETURNS JSON

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Network Unavailable"
message:@"Unable to contact server. Please try again later."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];

NSLog(@"Error: %@", error);

}];

NSLog(@"%@", json); // RETURNS NULL

return json;
}

@end

最佳答案

POST方法是异步的。这意味着该 block 进入一个单独的线程并等待执行。虽然这将进入后台,但您的其余代码将继续执行,就好像什么都没发生一样。所以它立即到达NSLog声明(可能在您开始 POST 请求之前)。

如果你想要 json block 之外的对象,您将不得不从 block 内部分派(dispatch)到您选择的方法并在那里继续您的操作。

[manager POST:@"http://192.168.0.100/app.php" parameters:postParameters success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSString *responseString = [operation responseString];

NSError *error;

json = [NSJSONSerialization
JSONObjectWithData:[responseString dataUsingEncoding:NSUTF8StringEncoding]
options:kNilOptions
error:&error];

NSLog(@"%@", json); // RETURNS JSON
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomethingWithJson:json];
});

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Network Unavailable"
message:@"Unable to contact server. Please try again later."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];

NSLog(@"Error: %@", error);

}];

关于ios - AFNetworking 数组在 block 内返回 JSON,但不在 block 外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21739790/

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