作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我刚开始在 iOS 中使用 block ,我认为这可能是我问题的症结所在。
我只想构建一个简单的静态 DataManager 类,它的唯一工作就是从我的 Restful 服务中获取数据。
我会从我所有的各种 UIViewControllers(或 collectionview/table Controller )中调用它
在我的课上我有一个看起来像这样的函数
+ (NSArray *) SearchByKeyword: (NSString*) keyword {
__block NSArray* searchResults = [[NSArray alloc] init];
NSString *baseURL = @"http://someURL.com/api/search";
NSString *requestURL = [baseURL stringByAppendingString:keyword];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:baseURL]];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET"
path:requestURL
parameters:nil];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
searchResults = [JSON valueForKeyPath:@""];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
}];
[operation start];
return searchResults;
}
但是,这会一直返回零数据。有人可以建议这样做的正确方法吗?
最佳答案
您正在尝试使用异步任务(JSON 操作)的结果作为同步方法调用的返回值,这就是您得不到数据的原因。
您可以为您的 View Controller 提供一个 API,该 API 可以获取完成 block 和失败 block ,类似于 AF 网络 API。然后,当结果传递到 block 中时, View Controller 可以对结果执行它们需要执行的操作。
根据您的问题修改您的代码:
typedef void (^SearchCompletionBlock)(NSArray *results);
typedef void (^SearchFailureBlock)(NSError *error);
+ (void)searchByKeyword:(NSString*)keyword completionBlock:(SearchCompletionBlock)completionBlock failureBlock:(SearchFailureBlock)failureBlock;
{
NSString *baseURL = @"http://someURL.com/api/search";
NSString *requestURL = [baseURL stringByAppendingString:keyword];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:baseURL]];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET"
path:requestURL
parameters:nil];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
if (completionBlock) {
completionBlockc([JSON valueForKeyPath:@""]);
}
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
if (failureBlock) {
failureBlock(error);
}
}];
[operation start];
}
然后客户端可以传递存储结果并重新加载 View 的完成 block 。像这样的东西:
^ (NSArray *results) {
self.results = results;
[self.tableView reloadData];
}
关于ios - 如何将 AFNetworking AFJSONRequestOperation 包装到单独的数据管理器类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15148971/
我刚开始使用 Dagger 2,想知道与我目前用来实现依赖注入(inject)的技术相比,它有什么优势。 目前,为了实现 DI,我创建了一个具有两种风格的项目:mock 和 prod。在这些风格中,我
我是一名优秀的程序员,十分优秀!