总是从 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】:您看不到结果,因为您为success
和failure
传入的块是异步运行的;当您的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 值的主要内容,如果未能解决你的问题,请参考以下文章
在 SwiftUI 类中调用包装的 UIViewController 函数时获得 nil