1

我在 iPad 3 4G 测试设备上从 url 获取图像时遇到问题。代码适用于 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];

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

谢谢!

4

2 回答 2

1

几个想法:

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

  2. 你能把它放在上下文中吗?例如,这是您的应用程序正在异步执行的操作(例如,表格视图的缩略图)吗?如果是这样,您是否使用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文件夹(尽管必须注意确定图像的更改)。

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

于 2013-01-24T07:12:29.940 回答
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];
于 2013-01-24T06:59:54.023 回答