表视图和 AFNetworking 异步调用

Posted

技术标签:

【中文标题】表视图和 AFNetworking 异步调用【英文标题】:Table View and AFNetworking Asynchronous Call 【发布时间】:2014-07-03 10:10:57 【问题描述】:

我是 ios 开发的新手,我正在尝试找出解决问题的最佳方法。我有一个UITableViewController 类,它在viewDidLoad 中调用一个名为fetchModules 的方法。这会使用 AFNetworking 2 获取我的表所需的所有数据。

但是,我的表委托方法(例如 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;

建议?

【问题讨论】:

和我一样的问题... 【参考方案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)

iOS - 在 AFNetworking 异步图像下载线程完成后重新加载 UITableView

如何理解阻塞和非阻塞同步和异步

如何理解阻塞和非阻塞同步和异步

同步/异步-阻塞/非阻塞

多线程-线程同步异步