使用AFNetworking通过JSON层次结构和objectForKey加载图像视图

时间:2014-04-17 00:40:30

标签: ios objective-c json afnetworking-2

AFNetworking来说很新,但在经过多次SO问题之后...我得出的结论是,这是我问题的解决方案。

我有一个动态加载我的TableViewController单元的JSON数据层次结构。我的所有文字字符串都是正确加载的,但我URL的图片没有进入我的imageview。

在使用AFNetworking库之前,我已经加载了图像,但是当我滚动并返回时(我们不得不再次加载),我遇到了一些问题,这些照片没有保持加载状态。

在那里拍摄我的照片我错过了什么?

TableViewController.m

-(void)viewDidLoad {
    [super viewDidLoad];

    // Set the side bar button action. When it's tapped, it'll show up the sidebar.
    siderbarButton.target = self.revealViewController;
    siderbarButton.action = @selector(revealToggle:);

    // Set the gesture
    [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];

    self.tableView.backgroundColor = [UIColor whiteColor];
    self.parentViewController.view.backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1];

    self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo_app_white.png"]];

    NSURL *myURL = [[NSURL alloc]initWithString:@"http://domain.com/json2.php"];
    NSData *myData = [[NSData alloc]initWithContentsOfURL:myURL];
    NSError *error;

    jsonArray = [NSJSONSerialization JSONObjectWithData:myData options:NSJSONReadingMutableContainers error:&error];

    [tableView reloadData]; // if tableView is unidentified make the tableView IBOutlet
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return jsonArray.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NeedCardTableViewCell *cell = (NeedCardTableViewCell *) [tableView dequeueReusableCellWithIdentifier:@"needCard"];

    if (cell == nil)
    {
        cell = [[NeedCardTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"needCard"];
    }

    NSDictionary *needs = jsonArray[indexPath.row]; // get the data dict for the row
    cell.textNeedTitle.text = [needs objectForKey: @"needTitle"];
    cell.textNeedPoster.text = [needs objectForKey: @"needPoster"];
    cell.textNeedDescrip.text = [needs objectForKey: @"needDescrip"];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:@"userImage" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        _imageProfPic.image = responseObject;
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];

    return cell;
}

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用AFNetworking+UIImageView类别?然后你可以打电话:

[_imageProfPic setImage:[NSURL URLWithString:@"http://myimageurl.com/imagename.jpg"]];

这将发出请求,然后将返回的图像设置为UIImageView的UIImage,而无需执行任何其他操作。您还应该考虑在AppDelegate中初始化NSURLCache:

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
                                                  diskCapacity:10 * 1024 * 1024
                                                      diskPath:nil];
[NSURLCache setSharedURLCache:cache];

看看NSHipster's run down on NSURLCache。这将有助于重新加载图像和所有请求,第二次更快。在处理图像和表格时,这一点越来越重要。

答案 1 :(得分:1)

使用本教程管理以解决这个问题: Networking Made Easy with AFNetworking

我使用最后一段代码来获得我想要的结果:

NSURL *url = [[NSURL alloc] initWithString:[movie objectForKey:@"artworkUrl100"]];
[cell.imageView setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder"]];

我剪切了他的代码的第二行,因为我的PHP / JSON

中已有if语句
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NeedCardTableViewCell *cell = (NeedCardTableViewCell *) [tableView dequeueReusableCellWithIdentifier:@"needCard"];

    if (cell == nil)
    {
        cell = [[NeedCardTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"needCard"];
    }

    NSDictionary *needs = jsonArray[indexPath.row]; // get the data dict for the row
    cell.textNeedTitle.text = [needs objectForKey: @"needTitle"];
    cell.textNeedPoster.text = [needs objectForKey: @"needPoster"];
    cell.textNeedDescrip.text = [needs objectForKey: @"needDescrip"];

    NSURL *url = [[NSURL alloc] initWithString:[needs objectForKey:@"userImage"]];
    [cell.imageProfPic setImageWithURL:url];

    return cell;
}

它就像一个魅力,因为我是AFNetworking的新人,所以教程非常有用。