AFNetworking异步数据提取

时间:2012-06-15 17:27:05

标签: objective-c ios asynchronous objective-c-blocks afnetworking

我正在使用AFNetworking库从服务器提取JSON提要来填充UIPickerView,但我在绕过异步处理方式时遇到了一些麻烦。 @property classChoicesNSArray,用于填充UIPickerView,因此网络通话只执行一次。但是,由于在返回实例变量时块未完成,因此getter返回nil,最终导致程序崩溃。任何帮助解决这个问题将不胜感激。如果您需要任何其他信息,请与我们联系。

PickerViewController.m classChoices Getter

- (NSArray *)classChoices {
    if (!_classChoices) {
        // self.brain here refers to code for the SignUpPickerBrain below
        [self.brain classChoicesForSignUpWithBlock:^(NSArray *classChoices) {
            _classChoices = classChoices;
        }];
    }
    return _classChoices;
}

SignUpPickerBrain.m

- (NSArray *)classChoicesForSignUpWithBlock:(void (^)(NSArray *classChoices))block {
    [[UloopAPIClient sharedClient] getPath:@"mobClass.php" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseJSON) {
        NSLog(responseJSON);
        if (block) {
            block(responseJSON);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);

        if (block) {
            block(nil);
        }
    }];
}

1 个答案:

答案 0 :(得分:2)

在PickerViewController中需要一个类似下面的方法,它在下载后返回数组。返回回调后,您可以继续使用代码:

- (void)classChoices:(void (^) (NSArray * classChoices)) _callback {
    if (!self.classChoices) {
        // self.brain here refers to code for the SignUpPickerBrain below
        [self.brain classChoicesForSignUpWithBlock:^(NSArray *classChoices) {
            _callback(classChoices);
        }];
    }
}

// call the method

- (void) viewDidLoad {

    [super viewDidLoad];

    [self classChoices:^(NSArray * updatedChoices) {

        self.classChoices = updatedChoices;

        [self.pickerView reloadAllComponents];

    }];

}