2014-07-03 31 views
1

我是iOS新手,我試圖弄清楚我的問題最好的解決方案是什麼。我有一個UITableViewController類,它在viewDidLoad中調用名爲fetchModules的方法。這使用AFNetworking 2獲取我需要的所有數據。表視圖和AFNetworking異步調用

但是,我的表委託方法(如numberOfRowsInSectioncellForRowAtIndexPath)失敗,因爲AFNetworking調用尚未完成,並且我正在使用的數組存儲數據沒有被填充。

我得到實際的錯誤是

終止應用程序由於未捕獲的異常 'NSRangeException'

這裏是我的代碼:

#import "HistoryTableViewController.h" 

@interface HistoryTableViewController() 

@property NSArray *modules; 

@end 

@implementation HistoryTableViewController 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.modules = [[NSArray alloc] init]; 

    [self fetchModules]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)fetchModules 
{ 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

    [manager.requestSerializer setValue:self.token forHTTPHeaderField:@"X-Auth-Token"]; 

    [manager GET:@"http://myurl.com/" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     //NSLog(@"JSON: %@", responseObject); 
     self.modules = [responseObject objectForKey:@"data"]; 
    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (self.modules && self.modules.count) { 
     return self.modules.count; 
    } else { 
     return 0; 
    } 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellID = @"Cell Identifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID]; 
    } 

    NSDictionary *module = [self.modules objectAtIndex:indexPath.row]; 
    cell.textLabel.text = [module objectForKey:@"code"]; 

    return cell; 
} 

建議?

+0

同樣的問題與我... –

回答

1

這是異步網絡調用的非常常見的解決方案。

添加[self.tableView reloadData]AFNetworking成功block內:

- (void)fetchModules 
{ 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

    [manager.requestSerializer setValue:self.token forHTTPHeaderField:@"X-Auth-Token"]; 

    [manager GET:@"http://myurl.com/" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     //NSLog(@"JSON: %@", responseObject); 
     self.modules = [responseObject objectForKey:@"data"]; 

     [self.tableView reloadData]; 

    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 
}`enter code here` 
+0

嗨。剛剛添加,但仍然得到一個NSRangeException。在AFNetworking調用完成之前,我是否需要在第一時間停止加載表格? – ritch

+1

立即工作。愚蠢的我,忘了將靜態單元改爲動態單元。 – ritch

0

我覺得條件應該是如下。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (self.modules != nil && self.modules.count > 0) { 
     return self.modules.count; 
    } else { 
     return 0; 
    } 
} 

另外,不要忘記在得到迴應後重新載入表格。

+0

謝謝你的幫助。 – ritch

0

幾個更正可能會幫助你。首先綜合屬性「模塊」。另外,在創建表格單元的委託方法中,如果「模塊」爲空,那麼該方法不應對「模塊」屬性執行任何操作,只返回「單元格」。我希望這可以幫助你

+0

謝謝你的幫助。我是iOS編程的新手,但在我閱讀的其中一篇教程中,它說我不需要在XCode 5中進行綜合,因爲它會自動爲您完成? – ritch