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

标签 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 图像。

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

我是 Swift 新手,所以我确信有一种我还不知道的简单方法可以完成此任务。

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 是一个元组数组 [(riddim: String, label: String, count: String,thumbnail: String)],包含已解析的 JSON 每个键的值。

我假设缩略图没有显示图像,因为数据已转义。

是否有与 PHPpg_unescape_bytea() 等效的函数,或者用户应该手动取消转义? (不过我不太确定如何手动转义。)

有没有一种更简单的方法可以通过 swift 中的 JSON 数据填充 UITableView

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

编辑: 我不再认为键“缩略图”的 JSON 数据采用转义格式,我只是查看了存储数据的数据库,例如 \377\330\377\340\000\020JFIF\000\001\002\000\000\001\000 ...。显然,从 \oct 的转换是由 PHP webservice 完成的,但我不知道为什么缩略图数据以 \x 开头。我更希望它以 ffd8ff...0xffd8ff... 开头。如果 JSON 数据包含正确转义的 bytea 数据,为什么应用程序根本不显示缩略图?

最佳答案

经过一夜好眠,消除了我的大脑停滞后,我立即以清醒的头脑查看代码,意识到了自己的错误;数据是以十六进制编码的有效图像数据,前缀为 \x

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

可以找到 NSData扩展 here ,感谢 Sjors Provoost

关于json - 如何使用包含 bytea 字段(PostgreSQL)数据的 JSON 填充 UITableViewCell 中的 UIImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32574408/

相关文章:

ios - Swift:如何使用 SQLite 列填充 UITableView

ios - 如何根据选定的单元格将 segue 推送到特定的 View Controller ?

javascript - 在javascript中获取根json元素

javascript - json2html如何处理json键中的特殊字符(例如@)

ios - 在 TextView 中渲染新行

XCode Playground 卡在异步代码上

ios - 如何通过单击表格 View Controller 中的单元格来生成 View Controller

objective-c - 目标/iOS : NSCFString not NSString?

json - 如何在 '' 内使用 GString 替换 json

swift - 对图像进行着色,快速取错颜色