Просмотр таблицы и асинхронный вызов AFNetworking

#ios #objective-c #uitableview #asynchronous #afnetworking-2

#iOS #objective-c #uitableview #асинхронный #afnetworking-2

Вопрос:

Я новичок в разработке iOS, и я пытаюсь выяснить, каким было бы наилучшее решение моей проблемы. У меня есть UITableViewController класс, который вызывает метод, названный fetchModules в viewDidLoad . Это извлекает все данные, которые мне нужны для моей таблицы, используя AFNetworking 2.

Однако мои методы делегирования таблиц, такие как numberOfRowsInSection и cellForRowAtIndexPath , дают сбой, поскольку вызов 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 amp;amp; 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;
}
  

Предложения?

Комментарии:

1. у меня та же проблема…

Ответ №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`
  

Комментарии:

1. Привет. Только что добавил это, но все равно получаю исключение NSRangeException. Нужно ли мне останавливать загрузку таблицы в первую очередь перед выполнением вызова AFNetworking?

2. Сейчас работает. Глупый я, забыл изменить статические ячейки на динамические.

Ответ №2:

Я думаю, что условия должны быть такими, как показано ниже.

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

Также не забудьте перезагрузить таблицу после получения ответа.

Ответ №3:

Вам могут помочь несколько исправлений. Сначала синтезируем свойство «modules». Также в методе делегирования для создания ячейки таблицы убедитесь, что если «modules» пуст, то этот метод не должен выполнять никаких операций со свойством «modules» и просто возвращать «cell». Я надеюсь, что это поможет вам

Комментарии:

1. Спасибо за вашу помощь. Я новичок в программировании на iOS, но в одном из руководств, которые я прочитал, сказано, что мне не нужно синтезировать в XCode 5, поскольку это автоматически выполняется для вас?