我想将图像从api加载到单元格内的UIImageView中。但是由于我先连续两次收到nill值,所以我不能这样做。 这是我的代码:
class MainController: UITableViewController{
var nulti = [Nulti]()
var picture = Picture()
let urlDel = "http://xx"
let urlPic = "http://xxx/"
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.rowHeight = 44
getNulti()
}
func getNulti(){
Alamofire.request(urlDel, method: .get)
.responseJSON { (response) in
if response.result.isSuccess {
guard let responseData = response.data else {return}
let jsonDecoder = JSONDecoder()
self.nulti = try! jsonDecoder.decode([Nulti].self, from: responseData)
for pic in self.nulti{
let id = pic.image
if(id != nil){
self.getPicture(id: id!.description)
}
}
self.tableView.reloadData()
}
else {
print("Error: \(String(describing: response.result.error))")
}
}
}
func getPicture(id: String){
Alamofire.request(urlPic + id, method: .get)
.responseJSON { response in
if response.result.isSuccess {
guard let responseData = response.data else {return}
let jsonDecoder = JSONDecoder()
self.picture = try! jsonDecoder.decode(Picture.self, from: responseData)
self.tableView.reloadData()
} else {
print("Error: \(String(describing: response.result.error))")
}
}
}
func picConvertor(id : String) -> UIImage{
let dataDecoded : Data = Data(base64Encoded: id, options: .ignoreUnknownCharacters)!
let decodedimage = UIImage(data: dataDecoded)
return decodedimage!
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return nulti.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell//
cell.cell?.text = nulti[indexPath.row].name
print(self.picture)
//let id = self.picture.image!.description
//cell.logo?.image = picConvertor(id: id)
return cell
}
}
然后我做了print(self.picture)以查看发生了什么,然后我看到了
图片(id:无,格式:无,图像:无)
图片(id:无,格式:无,图像:无)
图片(id:可选(2),格式:可选(“ png”),图片:可选(“ iVBORw0KGgoAAA ...”)
图片(id:可选(2),格式:可选(“ png”),图片:可选(“ iVBORw0KGg ...”)
答案 0 :(得分:0)
问题在于代码的时间顺序不是书面顺序。您的getPicture
是异步的。给定的图片将在未来的未知时间到达。但是无论如何,您的代码都会立即出现。因此,在这些行中:
for pic in self.nulti{
let id = pic.image
if(id != nil){
self.getPicture(id: id!.description)
}
}
self.tableView.reloadData()
...您要在任何图片到达之前 重新加载表格视图:
for pic in self.nulti{
let id = pic.image
if(id != nil){
self.getPicture(id: id!.description)
// 2 a picture arrives...
// 3 another picture arrives...
}
}
self.tableView.reloadData() // 1
因此,您正在做的事情将永远无法工作,只能通过一个属性将所有照片集中到一起。图片何时到达,以什么顺序到达,是完全未知的。因此您无法从属性“拾取”图片。您的代码是异步的:您必须异步处理每张到达的照片。