2016-03-08 104 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