在Tableview中加载json时发现无法转换类型值的错误

时间:2018-07-27 13:31:46

标签: swift3 tableview wordpress-rest-api

这是我的代码,无法将数组类型附加到UIImage,api已成功加载,我在附加数据时遇到问题

var images = UIImage

func downloadJsonWithURL() {
    let url = NSURL(string: urlString)
    URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in

        if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSObject {
            print(jsonObj!.value(forKey: "guid"))

            if let actorArray = jsonObj!.value(forKey: "guid") as? [NSObject] {

                    if let actorDict = actorArray as? NSObject
                    {



                        if let name = actorDict.value(forKey: "rendered") {



                            **self.images.append(name as! UIImage)**

                            print("\(name)")



                        }

                    }

            }

            OperationQueue.main.addOperation({
                self.tableView.reloadData()
            })
        }
    }).resume()
}

这是我的剩余api

引导{1} 呈现:http://thenewschef.com/wp-content/uploads/2018/02/startup.jpeg

2 个答案:

答案 0 :(得分:0)

所以,你可以这样做

var images = [[String:AnyObject]]()

override func viewDidLoad() {
    super.viewDidLoad()
    downloadJsonWithURL()
}

//Tableview methods

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return images.count
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
    return 135
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "DemoTableCell", for: indexPath) as! DemoTableCell

    let dict = images[indexPath.row]
    URLSession.shared.dataTask(with: NSURL(string: dict["rendered"] as! String)! as URL, completionHandler: { (data, response, error) -> Void in
        if error != nil {
            print(error as Any)
            return
        }
        DispatchQueue.main.async(execute: { () -> Void in
            let image = UIImage(data: data!)
            cell.imgView?.image = image
        })
    }).resume()

    return cell
}


//your api call

func downloadJsonWithURL() {

   let urlString = "https://thenewschef.com/wp-json/wp/v2/media"
    let url = NSURL(string: urlString)
    print(url as Any)
    URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in
        if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments)  {
            print((jsonObj as AnyObject).value(forKey: "guid") as Any)

            let responseJSON = (jsonObj as AnyObject).value(forKey: "guid") as Any
            let json = (responseJSON as AnyObject) as? NSArray
            self.images = json as! [[String:AnyObject]]
             print(self.images)

            OperationQueue.main.addOperation({
                self.demoTable.reloadData()
            })
        }
    }).resume()
}

就是这样,您获得了UIImage。

答案 1 :(得分:0)

  

使用高阶函数来增强上述解决方案的实现,以避免所有强制转换。

使用以下代码从服务器获取响应并在单个数组中过滤所需的imageUrl。

func downloadJsonWithURL() {
                 let urlString = "https://thenewschef.com/wp-json/wp/v2/media"
                 let url = NSURL(string: urlString)
                 URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {[weak self] (data, response, error) -> Void in
                 if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments)  {
                 let guids = (jsonObj as? [[String: Any]])?.map { $0["guid"] }
                 let imagesArray = (guids as? [[String: Any]])?.map {$0["rendered"]} as? [String]

                 OperationQueue.main.addOperation({
                    //Reload Table here...
                })
            }
        }).resume()
    }