如何使用包含bytea字段数据的JSON(PostgreSQL)在UITableViewCell中填充UIImage?

时间:2015-09-14 21:42:29

标签: json swift uitableview

我正在使用带有PostgreSQL后端的Web服务使用 JSON 中返回的数据填充UITableView。缩略图图像数据作为bytea存储在数据库中。

JSON字段'thumbnail'(recentRiddims[indexPath.row].thumbnail)返回的数据类似于:\xffd8ffe000104a46494600010200000100010000ffdb0043000806060706050807070709 ...

可以通过其魔术字节0xFFD8FF来判断它是 JPEG 图像。但是,该字符串似乎是转义的。在 PHP 中,我通常使用pg_unescape_bytea(data)来获取可用于在浏览器中显示图像的实际图像数据。因此,我在 PHP 中使用相同的 JSON 数据进行了尝试,我知道数据是有效的 JPEG 图像。

该应用程序编译并启动正常,但UIImageView中的缩略图UITableViewCell显示为空(灰色框,UIImageView背景的颜色),而{{1} } s'文本使用来自 JSON 的数据进行更新。

我是 Swift 的新手,所以我确信有一种简单的方法可以完成这项工作,我还不知道。

UILabel函数如下所示:

cellForRowAtIndexPath

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let recentRiddimsCell = tableView.dequeueReusableCellWithIdentifier("recentRiddimsCell", forIndexPath: indexPath) as! RecentRiddimsCell // Configure the cell... recentRiddimsCell.riddimLabel.text = recentRiddims[indexPath.row].riddim recentRiddimsCell.labelLabel.text = recentRiddims[indexPath.row].label //image test var thumbnailString: String! = recentRiddims[indexPath.row].thumbnail let imageData = NSData(data: thumbnailString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!) let image = UIImage(data: imageData) recentRiddimsCell.imageThumbnail.image = image return recentRiddimsCell } 是一个元组recentRiddims数组,包含每个键的解析后的 JSON 值。

我认为缩略图不显示图像,因为数据已转义。

是否有相当于 PHP [(riddim: String, label: String, count: String, thumbnail: String)]或用户是否应该手动转换? (我不确定如何手动浏览。)

是否有更简单的方法通过swift中的JSON数据填充pg_unescape_bytea()

项目的部署目标使用 Universal 设置为 iOS 8.4 ,在Yosemite上运行最新的XCode。

修改 我不再认为关键“缩略图”的 JSON 数据是转义格式的,我只是查看数据存储的数据库,如UITableView。显然,\377\330\377\340\000\020JFIF\000\001\002\000\000\001\000 ...的转换是由 PHP 网络服务完成的,但我不知道为什么缩略图数据以\oct开头。我更希望它以\xffd8ff...开头。如果 JSON 数据保存了正确转义的bytea数据,为什么应用程序根本不显示缩略图?

1 个答案:

答案 0 :(得分:0)

经过一夜的睡眠,消除了我的大脑失速后,我立刻意识到自己的错误。数据是以十六进制编码的有效图像数据,前缀为\x

我所要做的就是从\x对象中移除String,使用(thumbnailString as NSString).substringFromIndex(2)然后NSData.fromHexString(thumbnailString)来解码十六进制字符串并创建NSData来自它的对象。

可以找到extension的{​​{1}} here,将信用转到 Sjors Provoost