Swift 3 和 Alamofire - 来自 JSON 的图像和数据

Posted

技术标签:

【中文标题】Swift 3 和 Alamofire - 来自 JSON 的图像和数据【英文标题】:Swift 3 and Alamofire - Image and data from JSON 【发布时间】:2016-11-08 11:21:42 【问题描述】:

我有一个项目正在尝试使用 alamofire 从 web url 引入数据。我正在尝试引入图像和文本,但不断构建失败。我正在尝试将数据(图像和文本)添加到标签 = 1 和 2。我的代码低于任何帮助将不胜感激。我对斯威夫特相当陌生。谢谢

SWIFT

import UIKit
import Alamofire

struct postinput 
    let mainImage : UIImage!
    let name : String!




class TableViewController: UITableViewController 

    var postsinput = [postinput]()

    var mainURL = "https://www.testJSON.com"

    typealias JSONstandard = [String : AnyObject]

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        callAlamo(url: mainURL)
    

    func callAlamo(url : String)
        Alamofire.request(url).responseJSON(completionHandler: 
            response in

            self.parseData(JSONData: response.data!)


        )

    

    func parseData(JSONData : Data) 
        do 
            var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONstandard

            if let posts = readableJSON["posts"] as? [JSONstandard] 
                for post in posts  
                    let title = post["title"] as! String

                    if let images = post["image"] as? JSONstandard 
                        let mainImageURL = URL(string: imageData["url"] as! String)
                        let mainImageData = NSData(contentsOf: mainImageURL!)

                        let mainImage = UIImage(data: mainImageData as! Data)

                    

                    postsinput.append(postinput.init(mainImage: mainImage, name: name))


                

                self.tableView.reloadData() 
            

        


        catch 
            print(error)
        


    




    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return postsinput.count
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")

        // cell?.textLabel?.text = titles[indexPath.row]

        let mainImageView = cell?.viewWithTag(2) as! UIImageView

        mainImageView.image = postsinput[indexPath.row].mainImage

        let mainLabel = cell?.viewWithTag(1) as! UILabel

        mainLabel.text = postsinput[indexPath.row].name


        return cell!
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    



JSON

  posts: [  id: “000000”, url: "/content/interview2”, date: "2016-11-03 09:01:41", modified: "2016-11-03 09:03:47", title: "An interview", image: "https://www.example.com/sites/default/files/oregood.jpeg", summary:  value: "<p>Latin text here</p> ", format: "filtered_html"  ]

【问题讨论】:

你的parseData函数中的imageDataname是什么? 构建失败在哪里? 在你的func parseData(JSONData : Data) 你得到的构建失败错误是什么? 我正在学习教程,所以 imageData 和名称可能与我的 JSON 结构不对应,这就是我感到困惑的原因。 【参考方案1】:

以下是您的构建错误的原因如下:

    您在获取mainImage 的上下文之外添加了这一行postsinput.append(postinput.init(mainImage: mainImage, name: name)) 。基于json,我相信你应该这样重写它。

    if let imageUrl = post["image"] as? JSONstandard 
       let mainImageURL = URL(string: imageUrl)
       let mainImageData = NSData(contentsOf: mainImageURL!)
    
       let mainImage = UIImage(data: mainImageData as! Data)
       postsinput.append(postinput.init(mainImage: mainImage, name: title))
    
    

    即使您这样做,变量imageDataname 也未定义。你应该调查一下。

    只是一个建议,不要强制打开可选选项。尽可能使用可选绑定。

【讨论】:

克里希纳,我正在尝试从 JSON 中引入图像,我遵循了一个教程,这就是识别 imageData 和名称的原因,你知道从JSON?? 我在上面的第二行得到这个错误:无法将类型'TableViewController.JSONstandard'(又名'Dictionary')的值转换为预期的参数类型'String'

以上是关于Swift 3 和 Alamofire - 来自 JSON 的图像和数据的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 的 Swift 扩展方法返回 SwiftyJSON 结果

使用 Swift 3 和 Alamofire 在 JSON url 中的应用程序中没有显示任何内容

如何在 Alamofire 请求 swift 3 上发出警报

Swift 3 / Alamofire 4:在 TableView 上使用 ID 获取数据

iOS Swift 解析来自 Alamofire 的 JSON 响应

Swift Alamofire 如何处理来自循环的所有请求