2012-06-12 35 views
0

我正在創建一個應用程序,在第一個視圖中,用戶可以選擇登錄或註冊。在註冊視圖中是一個UITableViewCell,點擊後,用戶將看到一個包含UITableViewUIPickerView的視圖。 UITableView工作正常,但UIPickerView,應該動態拉動它應該顯示的數據,使用網絡調用,顯示出來,但似乎完全空白。加入幾條NSLog聲明,我注意到模型中使用AFNetworking來提取數據的方法永遠不會被調用。我已經發布了UIPickerViewDelegateUIPickerViewDataSource方法的代碼,以及應該在模型中提取數據的方法。提前致謝。AFNetworking數據獲取方法不叫

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 

回答

0

在此代碼示例中有很多反模式。我強烈建議對你目前的做法,並考慮以下幾點:

  • 做網絡異步,即不使用[operation waitUntilFinished];。任何時候當你創建一個網絡請求的方法時,給它一個塊參數,一旦結果出來,可以用作回調。
  • 將結果存儲在控制器的數組屬性中,並用它來驅動你的委託和數據源。按照您目前的方法,您每次顯示一行(!)時都會執行網絡請求。相反,初始化爲一個空數組,並且一旦將新結果設置爲該屬性,就重新加載數據源。一個異步請求。簡單。
  • 擺脫SignUpPickerBrain。要麼使用合適的模型,要麼只是在Controller中進行調用。示例iOS項目有一些很好的模式。
  • 使用AFHTTPClient。如果您正在與特定的web服務進行交互,那麼使用AFHTTPClient子類來處理所有這些請求可能非常有用。
+0

非常感謝您的回覆。不過,我有幾個問題。我認爲,當你正在處理提取數據和類似的事情時,你會使用像SignUpPickerBrain這樣的文件。你能詳細說明一下你的意思是什麼「適當的模型」?我也有點困惑,爲什麼我會給網絡請求方法一個阻止參數,因爲我沒有做任何事情,只是返回數據。儘管如此,我還是很陌生的,所以很容易成爲我在這裏看不到效用的原因。再次感謝您的所有建議。 – sethfri

+0

作爲方法參數傳遞的塊將在網絡請求操作的完成(或成功/失敗)塊中執行。這種方式是異步的。再次,請查看AFNetworking中的iOS示例項目,以查看這個實例。 – mattt