0

我正在将我的应用程序代码移动到 MVC 模型,因此我创建了一个方法来从 API 检索一些数据。

+ (NSMutableArray *)loadFromFeed {
    NSString *feed = @"https://api.test.com";

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:feedUrl]];

    request = [mutableRequest copy];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    operation.responseSerializer = [JSONResponseSerializerWithData serializer];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSArray *jsonArray = (NSArray *)[responseObject objectForKey:@"items"];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        CLS_LOG(@"Error");
    }];
}

现在,理想情况下,我想jsonArray作为此方法的一部分返回。但是,由于AFHTTPRequestOperation是异步的,我不知道如何解决这个问题并且仍然可以[Data loadFromFeed];在应用程序的任何地方调用。我怎样才能做到这一点?

4

1 回答 1

2

您可以将两个名为 success 和 failure 的块传递给loadFromFeed,然后从您的setCompletionBlockWithSuccess成功和失败块中调用这两个块,将 jsonArray 传递给成功块:

typedef void (^Success)(id data);
typedef void (^Failure)(NSError *error);

- (void)loadFromFeed:(Success)success failure:(Failure)failure;


[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSArray *jsonArray = (NSArray *)[responseObject objectForKey:@"items"];
    success?success(jsonArray):nil;
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    failure?failure(error):nil;
}];

然后以这种方式使用:

[Data loadFromFeed:^(id data) {
    NSLog(@"%@",data)
} failure:^(NSError *error) {
    NSLog(@"%@",error)
}];];
于 2015-05-27T18:08:07.063 回答