0

我正在使用 AFNetworking 库从服务器中提取 JSON 提要来填充 a 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;
}

注册PickerBrain.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);
        }
    }];
}
4

1 回答 1

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];

    }];

}
于 2012-06-15T17:30:17.723 回答