【问题标题】:Having trouble with NSString return type in Objective-C blocks [duplicate]Objective-C块中的NSString返回类型有问题[重复]
【发布时间】:2014-02-07 21:15:20
【问题描述】:

谢谢你的帮助。我的问题是下一个。我需要使用 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 进行开发。请帮我!!!谢谢你。

【问题讨论】:

  • 为什么要在块内返回 NSString*?

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


【解决方案1】:

实际上这是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
}];

【讨论】:

  • 我明白,但不要问我如何解决。我怎样才能为我解决这个问题。谢谢你的帮助。
  • 您现在应该调用此方法并将完成处理程序块作为参数传递。当这里调用处理程序时,您的块将运行
  • 我这样做了,但显示错误:“控制到达非无效函数的结尾”。这个问题不是 return none finally 行代码。但是如果我返回任何对象,那么我会返回字符串“none”或 nil。我在包含块(高优先级)中返回字符串,但方法 AFNetworking 是或是使用块。向我显示此链接的问题详细信息,请帮助我,谢谢:stackoverflow.com/questions/21640102/…
  • 此方法的返回类型应为 void...请参阅我编辑的答案...
  • 谢谢伙计。我可以用你的解决方案解决这个问题。
【解决方案2】:

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

听起来您正在尝试返回异步方法的结果。这通常不实用。异步方法的全部意义在于它不会与其他事情一起发生。您需要让该方法自己进行回调。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多