0

AFNetworking ライブラリを使用してサーバーから JSON フィードを取得し、UIPickerView. は@property classChoicesNSArray入力するUIPickerViewために使用される です。これにより、Web 呼び出しは 1 回だけ実行されます。ただし、インスタンス変数が返されるまでにブロックが終了していないため、ゲッターは nil を返し、後でプログラムがクラッシュする原因になります。これを修正するための助けをいただければ幸いです。追加情報が必要な場合はお知らせください。

PickerViewController.m classChoices ゲッター

- (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);
        }
    }];
}
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 に答える