gpt4 book ai didi

ios - 如何将 AFNetworking AFJSONRequestOperation 包装到单独的数据管理器类中

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:03:31 25 4
gpt4 key购买 nike

我刚开始在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com