AFHttpclient 在块中获取 json 主体但外部函数返回 null

Posted

技术标签:

【中文标题】AFHttpclient 在块中获取 json 主体但外部函数返回 null【英文标题】:AFHttpclient get json body in block but outer function returns null 【发布时间】:2013-02-13 23:04:09 【问题描述】:

我正在尝试在某些 url 和正文中发送 post 请求以仅作为 json 数据(尝试注册新用户发送 json 之类的


    "username": "test",
    "password": "test",
    "email": "email@gmail.com"

我有类似的功能

-(NSString*) sendPostOnUrl:(NSString*) url
            withParameters:(NSDictionary*)params
    __block NSString* response = nil;
    NSError *error;
    NSURL *u = [NSURL URLWithString:url];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL: u];

    [httpClient postPath:REGISTER
              parameters:params
                 success:^(AFHTTPRequestOperation *operation, id responseObject) 
                     response = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
                     NSLog(@"Request Successful, response '%@'", response);
                  failure:^(AFHTTPRequestOperation *operation, NSError *error) 
                     NSLog(@"[HTTPClient Error]: %@", error.localizedDescription);
                 ];
    return response;

其中 params 是 NSDictionary 键,其中包含用户名、密码和电子邮件以及这些键的值。 问题是当我发送时,我总是返回得到 null 作为响应(最新行),但在 NSLog 中我得到 json 响应。我对 ios 很陌生,在我看来,我需要以某种方式与 return 同步从功能,但不知道如何,谁能给我一个线索我做错了什么? (当我尝试调试时,params 包含所有这些键,url 没问题,REGISTER 是 NSString 常量)

【问题讨论】:

【参考方案1】:

块是异步的——这里的问题是“response = [[NSString alloc] initWithData...”在你退出方法后执行的块内。更好的方法是不在方法中执行此操作,而是将此代码放在您调用 sendPostOnUrl:withParameters: 的位置,并在成功块中执行您需要执行的任何操作。所以而不是:

self.something = [self sendPostOnUrl:url withParameters:@"username":"test" etc];

你这样做:

NSError *error;
NSURL *u = [NSURL URLWithString:url];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL: u];
__weak YourClassName *me = self;
[httpClient postPath:REGISTER
          parameters:params
             success:^(AFHTTPRequestOperation *operation, id responseObject) 
                 me.something = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
                 NSLog(@"Request Successful, response '%@'", response);
              failure:^(AFHTTPRequestOperation *operation, NSError *error) 
                 NSLog(@"[HTTPClient Error]: %@", error.localizedDescription);
             ];

另外,请注意“__weak YourClassName *me = self”,您不能在块中引用 self,因为它会导致保留循环。

【讨论】:

你真的需要弱自我吗?创建这个块的对象在哪里保留它? @CarlVeazey 在 ARC 下的块会自动保留它们捕获的任何对象。我以为这是 ARC 代码。

以上是关于AFHttpclient 在块中获取 json 主体但外部函数返回 null的主要内容,如果未能解决你的问题,请参考以下文章

在块中返回非指针对象时出现问题

ALAssetLibraryGroup 在块中找到相机胶卷

在块中调用 autorelease

在块中复制和自动释放本地变量

有人可以解释 Ruby 在块中使用管道字符吗?

无法在块中翻译 Django 模板