总是从 iOS 中的函数获得 nil 值

Posted

技术标签:

【中文标题】总是从 iOS 中的函数获得 nil 值【英文标题】:Always got nil value from the function in iOS 【发布时间】:2013-11-19 09:02:20 【问题描述】:

我正在使用 AFNetworking 进行一些 GET 查询。但是我的函数总是返回 nil 值。我哪里错了?

+ (NSString *)getRequestFromUrl:(NSString *)requestUrl 
    NSString * completeRequestUrl = [NSString stringWithFormat:@"%@%@", BASE_URL, requestUrl];
    __block NSString * results;
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:completeRequestUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
        results = [NSString stringWithFormat:@"%@", responseObject];
     failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        results = [NSString stringWithFormat:@"Error"];
    ];
    NSLog(@"%@", results);
    return results;

谢谢!阿尔乔姆。

【问题讨论】:

AFNetworking GET:parameters:success:failure: 函数是异步的。等到您点击回线时,网络还没有完成。你需要有一些其他的方法来从函数中获取数据。此刻它...创建结果,启动连接,处理一点连接,返回结果,处理一个但更多的连接,连接完成,根据连接的结果设置结果字符串。 【参考方案1】:

您看不到结果,因为您为successfailure 传入的块是异步运行的;当您的NSLog 被调用时,Web 服务还没有返回。如果您将 NSLog 移动到成功和失败块内,您应该会看到结果输出到您的控制台。

由于这些调用的异步特性,您将无法简单地从您的方法中返回值。相反,您可能希望将自己的块作为参数,然后您可以在有结果时调用它。例如:

+ (void)getRequestFromUrl:(NSString *)requestUrl withCompletion:((void (^)(NSString *result))completion 

    NSString * completeRequestUrl = [NSString stringWithFormat:@"%@%@", BASE_URL, requestUrl];
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:completeRequestUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
        NSString *results = [NSString stringWithFormat:@"%@", responseObject];
        if (completion)
            completion(results);
     failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        NSString *results = [NSString stringWithFormat:@"Error"];
        if (completion)
            completion(results);
    ];

然后你会像这样调用你的方法:

[YourClass getRequestFromUrl:@"http://www.example.com" withCompletion:^(NSString *results)
    NSLog(@"Results: %@", results);

AFNetworking 的示例项目有一个使用块参数从 Web 服务调用返回值的示例:https://github.com/AFNetworking/AFNetworking/blob/master/Example/Classes/Models/Post.m

【讨论】:

@Fogmeister 你应该一直在写你的答案,而不是在评论中做一个迷你答案! 伙计,另一个问题是:如果我想从完成块中返回一些东西(NSArray)该怎么办?我的方法是: - (NSArray *) methodname [MyClass getRequest ... //Filling NSArray ]; 在使用上述代码 sn-p 调用时,我在方法的签名中得到“预期类型”。【参考方案2】:
- (void)POST:(NSString *)URLString 
          parameters:(id)parameters
          constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
          progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress
          success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
          failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure


 [_manager POST:[NSString stringWithFormat:@"%@%@",API_HOST,URLString] parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) 
    block(formData);
  progress:^(NSProgress * _Nonnull uploadProgress1) 
    uploadProgress(uploadProgress1);
  success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) 
    success(task,responseObject);
  failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) 

    failure(task,error);
];

【讨论】:

真的吗?) 2013 年

以上是关于总是从 iOS 中的函数获得 nil 值的主要内容,如果未能解决你的问题,请参考以下文章

总是从 CLLocationManager 获得相同的坐标

为啥main里的init函数没有执行

在 SwiftUI 类中调用包装的 UIViewController 函数时获得 nil

C语言中总是从main函数开始执行,那执行好main函数后,是按照从上到下的顺序执行吗

如何在保存之前查询 CloudCode 中的对象?

Lua 函数如何返回 nil,即使函数内部的返回值不是 nil?