想要使用我在使用 AFNetworking 时取回的数据

Wanting to use the data I get back when using AFNetworking

我正在使用 AFNetworking 获得 JSON 响应。我得到的是 PhotoPXArray(我使用 mantle 创建的模型)。日志输出正是我想要的数据。我的问题是使用数据。如何将响应数据保存为可在我的程序的其他地方使用的变量。

此外,我正在使用 Sculptor 来帮助进行序列化。

-(NSArray*) getPhotoForWord:(NSString*)word {
    NSArray *results = nil;

    NSString *requestString = BASE_URL;
    requestString = [requestString stringByAppendingString:@"photos/search?term="];
    requestString = [requestString stringByAppendingString:word];
    requestString = [requestString stringByAppendingString:CONSUMER_KEY];



    NSString *encoded = [requestString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [SCLMantleResponseSerializer serializerForModelClass:PhotoPXArray.class];
    [manager GET:encoded
      parameters:nil
         //success:^(AFHTTPRequestOperation *operation, id responseObject) {
         success:^(AFHTTPRequestOperation *operation, PhotoPXArray *responseObject) {
             NSLog(@"JSON: %@", responseObject);


         } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             NSLog(@"Error: %@", error);
         }];


    return results;
}
@end

阅读关于 blocks and variables. Or you can view this question 的 Apple 文档,它可能也会回答您的问题。

来自 Apple 文档:

__block variables live in storage that is shared between the lexical scope of the variable and all blocks and block copies declared or created within the variable’s lexical scope. Thus, the storage will survive the destruction of the stack frame if any copies of the blocks declared within the frame survive beyond the end of the frame (for example, by being enqueued somewhere for later execution). Multiple blocks in a given lexical scope can simultaneously use a shared variable.

使用完成块来获取数据:

- (void)getPhotoForWord:(NSString *)word completionHandler:(void ^(PhotoPXArray *photoArray))completionHandler
{
    NSString *requestString = BASE_URL;
    requestString = [requestString stringByAppendingString:@"photos/search?term="];
    requestString = [requestString stringByAppendingString:word];
    requestString = [requestString stringByAppendingString:CONSUMER_KEY];

    NSString *encoded = [requestString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [SCLMantleResponseSerializer serializerForModelClass:PhotoPXArray.class];
    [manager GET:encoded
      parameters:nil
         success:^(AFHTTPRequestOperation *operation, PhotoPXArray *responseObject) {
            NSLog(@"JSON: %@", responseObject);
            if (completionHandler) {
                completionHandler(responseObject);
            }
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
     }];
}

然后这样称呼它:

[object getPhotoForWord:@"word" completionHandler:^(PhotoPXArray *photoArray) {
    // Do something with photo array.
}];

请注意,此调用是异步的,将在未来的某个未知时间完成。此外,您可能应该在完成块中使用 NSError 参数,以便您可以查看请求是否出错,但我会把它留给你。