#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, поскольку это автоматически выполняется для вас?