iPad 3 4G不会显示网址图片

时间:2013-01-24 06:36:36

标签: ios objective-c xcode retina-display

我在iPad 3 4G测试设备上从网址获取图像时遇到问题。 代码适用于ipad 1& 2还有iphone 3gs和iphone 4。 但是,当从服务器请求时,图像似乎是nil

我没有遇到这个问题,但客户报告问题......

我相信这个问题在以下代码中

代码:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.image.com/img_download/499441.jpg"]];
UIImage *thumbnail = [UIImage imageWithData:data];

此代码中的网址不是真实的,但澄清是正确的。

谢谢!

2 个答案:

答案 0 :(得分:1)

有几点想法:

  1. 我建议使用dataWithContentsOfURL:options:error:而不是dataWithContentsOfURL,并报告错误代码。或者使用可能提供更多诊断信息的NSURLConnection或其他框架(例如AFNetworking?)。但我怀疑dataWithContentsOfURL:options:error:可以提供必要的错误信息。

  2. 你能把它放在上下文中吗?例如,这是您的应用程序异步执行的操作(例如,tableview的缩略图)吗?如果是这样,您是否使用NSOperationQueue而使用相当小的maxConcurrentOperationCount而不是全局调度队列,以确保不超过允许的并发连接数?

    例如,如果你像这样更新你的tableview:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"image.com/img_download/499441.jpg"]];
        UIImage *thumbnail = [UIImage imageWithData:data];
    
        // presumably you're updating your UI like so
        dispatch_async(dispatch_get_main_queue(), ^{
            // update UI
        });
    });
    

    你应该做以下事情。首先,定义一个类属性:

    @property (nonatomic, strong) NSOperationQueue *queue;
    

    其次,您应该在viewDidLoad中初始化它,指定可接受的并发操作数:

    self.queue = [[NSOperationQueue alloc] init];
    self.queue.maxConcurrentOperationCount = 4;
    

    最后,将dispatch_async替换为:

    [self.queue addOperationWithBlock:^{
        NSError *error = nil;
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"image.com/img_download/499441.jpg"]
                                             options:0
                                               error:&error];
    
        if (error)
        {
            // log or display what the error is
        }
        else
        {
            UIImage *thumbnail = [UIImage imageWithData:data];
    
            if (thumbnail)
            {
                // update UI in the main queue
    
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    
                    // make sure the cell is still visible
    
                    UITableViewCell *updateCell = [tableView cellForRowAtIndexPath:indexPath];
    
                    // if so, update the image
    
                    if (updateCell)
                    {
                        updateCell.imageView.image = thumbnail;
                    }
                }];
            }
        }
    }];
    

    注意,您可能还希望进行缓存以消除重新加载已下载的图像。有关示例,请参阅https://stackoverflow.com/a/14444605/1271826。如果要跨会话缓存图像,也可以将图像缓存到Documents文件夹(尽管必须小心确定图像中的更改)。

  3. 对于我的第二点,有时连接问题不是由失败的特定行引起的,而是更广泛问题的症状,因此,我们需要更多关于如何在您的代码中使用代码的信息问题

答案 1 :(得分:0)

在项目中添加Base64类www.imthi.com/wp-content/uploads/2010/08/base64.zip现在编码为:

NSData* data = UIImageJPEGRepresentation(yourImage, 1.0f);
[Base64 initialize];
NSString *strEncoded = [Base64 encode:data];

解码为:

[Base64 initialize]; 
NSData* data = [Base64 decode:strEncoded ];;
image.image = [UIImage imageWithData:data];