在Objective-C块中遇到NSString返回类型的问题

时间:2014-02-07 21:15:21

标签: ios objective-c objective-c-blocks afnetworking-2

谢谢你的帮助。我的问题是下一个。我需要使用AFNetworking,当请求请求服务器时,服务器是响应。这个结果我需要在我的方法中返回。 AFNetworking方法使用块成功或失败。我想在连续或失败的选项块中返回返回服务器字符串(操作)。

- (NSString *)executeMultipart:(NSURL *)url
{
    __block NSString *strJSON;

    [_operationManager POST:[url absoluteString]parameters:_params
  constructingBodyWithBlock:^(id<AFMultipartFormData> formData){
        [formData appendPartWithFormData:[_params objectForKey:TAG_PHOTO] name:TAG_PHOTO];
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        strJSON = [operation.responseString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        return strJSON;
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        strJSON = [operation.responseString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        return strJSON;
    }];
}

但显示错误:

  

“不兼容的块指针类型发送'NSString   *(^)(AFHTTPRequestOperation * __ strong,_ strong id)'到'void(^)类型的参数(AFHTTPRequestOperation * _strong,__strong id)'“

如果我的问题很愚蠢,我很抱歉,因为我开始使用iOS进行开发。请帮我!!!谢谢你。

2 个答案:

答案 0 :(得分:2)

POST:parameters:constructingBodyWithBlock:方法需要一个不返回任何内容的块。

听起来你正在尝试返回异步方法的结果。这通常不实用。异步方法的全部意义在于,它不会与其他事物一致。您需要让该方法接受自己的回调。

答案 1 :(得分:2)

实际上这是async block,你和方法将在块执行完全之前返回。 你不应该返回这个string你应该调用一些完成处理程序或委托方法。 最好的是将完成处理程序传递给方法并调用返回字符串的完成处理程序。

你的方法应该是这样的。

- (void)executeMultipart:(NSURL *)url withCompletionHandler:(void (^)(NSString*))handler
{
    __block NSString *strJSON;

    [_operationManager POST:[url absoluteString]parameters:_params
  constructingBodyWithBlock:^(id<AFMultipartFormData> formData){
        [formData appendPartWithFormData:[_params objectForKey:TAG_PHOTO] name:TAG_PHOTO];
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        strJSON = [operation.responseString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
       handler(strJSON);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        strJSON = [operation.responseString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
       handler(strJSON);
    }];
}

从您使用此方法的类中,您应该将此方法称为

[obj executeMultipart:url withCompletionHandler:^(NSString* returnString)handler{
// code here 
// do whatever you want to with return string
}];