2016-03-08 20 views
1

由于我是IOS新手,AFNetworking 3,0是新手,我不知道如何从AFHTTPSessionManager中检索数据。 我不得不以下消息,我想返回结果从AFHTTPSessionManager获取数据

- (NSString *) makeServiceCall; 
{ 
    NSString *response = @""; 
    @try { 

     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
     [manager 
     POST:self.url.absoluteString 
     parameters:self.parameters 
     progress:nil 
     success:^(NSURLSessionDataTask *task, id responseObject) { 
      NSLog(@"Success: %@", responseObject);} 
     failure:^(NSURLSessionDataTask * task, NSError * error) { 
      NSLog(@"Error: %@", error); 
     }]; 
     [AFHTTPSessionManager manager].securityPolicy.allowInvalidCertificates = YES; 
    } 
    @catch (NSException *exception) { 
     NSLog(@"%@", exception.reason); 
    } 
} 

回答

1

方法AFHTTPSessionManager POST:parameters:progress:success:failure:是一种异步方法。

你要做的是从调用它的方法返回一个字符串。由于该方法将在下载开始之前完成,因此这不起作用。

你需要一个完成的块像这样来调用这个...

- (void)getStringWithCompletionHandler:(void (^)(id))completion { 
    NSLog(@"Method started"); 
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
    [manager 
    POST:self.url.absoluteString 
    parameters:self.parameters 
    progress:^(NSProgress * _Nonnull uploadProgress) { 
     NSLog(@"Download underway"); 
    } 
    success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSLog(@"Download successful"); 
     completion(responseObject); 
    } 
    failure:^(NSURLSessionDataTask * task, NSError * error) { 
     NSLog(@"Error"); 
    }]; 

    // trying to return a string here won't work because the download hasn't finished yet. 
    // You can see the order of things happening by adding logs... 
    NSLog(@"Method finished"); 
} 

在这个代码将日志的顺序...

  1. 方法开始
  2. 完成方法
  3. 正在下载
  4. 下载成功

正如你所看到的,试图在方法结束时返回将不起作用,因为下载还没有完成。

+0

对不起,我更新了这个问题,我不知道AFHTTPSessionManager的返回类型是什么,我只是想让方法返回请求的响应。 –

+0

@HarounSMIDA你没看过我的回答吗?你不能这样做。下载是异步的。在方法结束之前,它不会下载响应。 – Fogmeister

+0

@HarounSMIDA已更改,现在完成块将接受任何对象类型。 – Fogmeister