表视图和 AFNetworking 异步调用
Posted
技术标签:
【中文标题】表视图和 AFNetworking 异步调用【英文标题】:Table View and AFNetworking Asynchronous Call 【发布时间】:2014-07-03 10:10:57 【问题描述】:我是 ios 开发的新手,我正在尝试找出解决问题的最佳方法。我有一个UITableViewController
类,它在viewDidLoad
中调用一个名为fetchModules
的方法。这会使用 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 && 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】:这是异步网络调用非常常见的解决方案。
在AFNetworking
内添加[self.tableView reloadData]
成功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`
【讨论】:
嗨。刚刚添加,但仍然得到一个 NSRangeException。在调用 AFNetworking 之前,我是否需要首先停止加载表? 现在工作。愚蠢的我,忘记将静态单元格更改为动态单元格。【参考方案2】:我认为条件应该如下。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
if (self.modules != nil && self.modules.count > 0)
return self.modules.count;
else
return 0;
也不要忘记在收到响应后重新加载表格。
【讨论】:
感谢您的帮助。【参考方案3】:一些更正可能会对您有所帮助。首先综合属性“模块”。同样在创建表格单元格的委托方法中,确保如果“模块”为空,则该方法不应对“模块”属性执行任何操作,而只返回“单元格”。希望对你有帮助
【讨论】:
感谢您的帮助。我是 iOS 编程新手,但在我阅读的一篇教程中,它说我不需要在 XCode 5 中进行综合,因为它会自动为您完成?以上是关于表视图和 AFNetworking 异步调用的主要内容,如果未能解决你的问题,请参考以下文章
同步(Synchronous)和异步(Asynchronous)