我在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];
此代码中的网址不是真实的,但澄清是正确的。
谢谢!
答案 0 :(得分:1)
有几点想法:
我建议使用dataWithContentsOfURL:options:error:
而不是dataWithContentsOfURL
,并报告错误代码。或者使用可能提供更多诊断信息的NSURLConnection
或其他框架(例如AFNetworking
?)。但我怀疑dataWithContentsOfURL:options:error:
可以提供必要的错误信息。
你能把它放在上下文中吗?例如,这是您的应用程序异步执行的操作(例如,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
文件夹(尽管必须小心确定图像中的更改)。
对于我的第二点,有时连接问题不是由失败的特定行引起的,而是更广泛问题的症状,因此,我们需要更多关于如何在您的代码中使用代码的信息问题
答案 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];