0

最初のビューで、ユーザーにログインまたは登録のオプションが与えられるアプリを作成しています。レジスタビューには、クリックすると、とUITableViewCellを含むビューにユーザーが移動します。は正常に機能していますが、Web呼び出しを使用して表示するはずのデータを動的にプルするはずのが表示されていますが、完全に空白で表示されます。いくつかのステートメントを入力すると、を使用してデータをプルするモデルのメソッドが呼び出されないことに気付きました。以下のコードとメソッド、およびモデル内のデータをプルすることになっているメソッドを投稿しました。前もって感謝します。UITableViewUIPickerViewUITableViewUIPickerViewNSLogAFNetworkingUIPickerViewDelegateUIPickerViewDataSource

UIPickerViewDelegate

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row 
            forComponent:(NSInteger)component {
    return [[self.brain classChoicesForSignUp] objectAtIndex:row];
}

UIPickerViewDataSource

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView 
numberOfRowsInComponent:(NSInteger)component {
    size_t numberOfRows = [self.brain classChoicesForSignUp].count;

    NSLog(@"Number of Rows: %@", [[NSNumber numberWithFloat:numberOfRows] stringValue]);

    return numberOfRows;
}

SignUpPickerBrain.m

#import "SignUpPickerBrain.h"
#import "AFJSONRequestOperation.h"

@implementation SignUpPickerBrain

#pragma mark - Picker Data

- (NSArray *)classChoicesForSignUp {
    NSLog(@"Class choices method called");
    // Note that in my code, the actual URL is present here.
    NSURL *url = [NSURL URLWithString:@"the URL"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        NSLog(@"Success!");
        NSLog([JSON description]);
    } failure:nil];

    [operation start];
    [operation waitUntilFinished];
    NSLog([operation responseJSON]);
    return [operation responseJSON];
}

@end
4

1 に答える 1

0

このコード サンプルでは、​​多くのアンチ パターンが使用されています。現在のアプローチに反対することを強くお勧めします。次の点を考慮してください。

  • ネットワーキングを非同期に行います。つまり、使用しないでください[operation waitUntilFinished];。ネットワーク リクエストを行うメソッドを作成するときはいつでも、結果が入ってきたらコールバックとして使用できるブロック パラメーターを指定します。
  • 結果をコントローラーなどの配列プロパティに保存し、それを使用してデリゲートとデータソースを駆動します。現在のアプローチでは、行が表示されるたびにネットワーク リクエストを実行します (!)。代わりに、空の配列に初期化し、新しい結果がそのプロパティに設定されたら、データ ソースを再読み込みします。1 つの非同期要求。簡単。
  • を取り除きSignUpPickerBrainます。適切なモデルを使用するか、コントローラーで呼び出し自体を行います。サンプル iOS プロジェクトには、従うべき優れたパターンがいくつかあります。
  • を使用しAFHTTPClientます。特定の Web サービスと対話している場合AFHTTPClient、それらのすべての要求を処理するサブクラスがあると非常に便利です。
于 2012-06-13T15:16:20.403 に答える