Swift 4 AlamofireImage с ячейкой UITableView
Я использую AlamofireImages, чтобы попытаться загрузить изображение с сервера и отобразить его в моей ячейке представления таблицы, это то, что я получил, но мои изображения не отображаются, только textLabel и detailTextLabel
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "trendingCell", for: indexPath)
print(self.array[indexPath.row])
cell.textLabel?.text = (self.array[indexPath.row]["title"] as! String)
cell.detailTextLabel?.text = (self.array[indexPath.row]["username"] as! String)
Alamofire.request("http://xxxxxxx.com/uploads/" + (self.array[indexPath.row]["cover"] as! String)).responseImage { response in
if let image = response.result.value {
cell.imageView?.image = image
}
}
return cell
}
9 ответов
попробуйте это:
Alamofire.request(imageUrl!, method: .get).response { response in
guard let image = UIImage(data:response.data!) else {
// Handle error
return
}
let imageData = UIImageJPEGRepresentation(image,1.0)
cell.myImage.image = UIImage(data : imageData!)
}
это отлично работает для меня.. Надеюсь, это будет полезно.
конечно ваше изображение не будет отображаться для вас. Причина, когда Alamofire начинает загрузку изображения его процесс в фоновом потоке. Но вы работаете в основном потоке или потоке пользовательского интерфейса, поэтому вам нужно поменять фон на основной поток, он будет работать для вас.
Alamofire.request("http://xxxxxxx.com/uploads/" + (self.array[indexPath.row]["cover"] as! String)).responseImage { response in
DispatchQueue.main.async {
if let image = response.result.value {
cell.imageView?.image = image
}
}
}
Если вы думаете, что вам трудно это сделать, я рекомендую вам использовать эту библиотеку под названием Kingfisher, она будет обрабатывать асинхронные изображения загрузки для вас, которые заставляют таблицу вашей ячейки работать в гладко.
Вы можете использовать SDWebImage
сначала вам нужно импортировать это
import SDWebImage
затем вы можете использовать этот метод
let imgUrl = URL(string:"your image URL string")
cell.imageView?.sd_setImage(with: imgUrl, placeholderImage: UIImage(named: "propic"))
Использование AlamofireImages
if let url = URL(string: "your url") {
cell.imageView?.af_setImage(withURL:url, placeholderImage: nil, filter: nil, imageTransition: .crossDissolve(0.2), runImageTransitionIfCached: false, completion: {response in
// do stuff when is downloaded completely.
})
}
ваш код правильный. я думаю, что транспортная безопасность блокирует ваш образ через http . добавьте это в свою информацию.plist file
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key> //put your domain name here
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
и вы также можете использовать библиотеку изображений alamofire. просто добавьте под alamofireImage.
сначала вы должны проверить, есть ли у вас правильный ответ, если у вас есть reasponse, чем написать код, как
Alamofire.request(imageUrl!, method: .get).response { response in
if let image = UIImage(data: response.data!) {
cell. imageView?.image = image
}
}
это помогло мне:
сначала создайте эту функцию, чтобы помочь снять изображение. Если вы вытягиваете несколько изображений, вы можете создать новый файл swift и сделать его статическим или просто вызвать его в файле, который вам нужен. Таким образом, вы можете ссылаться на него вместо перезаписи кода:
static func loadImage(_ imageView: UIImageView,_ urlString: String) {
let imgURL: URL = URL(string: urlString)!
URLSession.shared.dataTask(with: imgURL) { (data, respond, error) in
guard let data = data, error == nil else { return}
DispatchQueue.main.async (execute: {
imageView.image = UIImage(data: data)
})
}.resume()
}
затем, чтобы вытащить информацию:
if let logoName = variable.logo {
StaticFileName.loadImage(cell.imgVariableInCell, "\(logoName)")
}
return cell
}
тогда вы хорошо идти.
вы должны передать ссылку как переменную переменной в ячейку и переопределить функцию awakefromnib в UITableViewCell. Внутри пера awakeFrom вы вызываете запрос alamofire для загрузки изображения в ячейку, таким образом, вы не будете вызывать запрос каждый раз, когда он повторно использует ячейку.
так
//CellCode
import Alamofire
...
var imageLink:String?
override func awakeFromNib() {
super.awakeFromNib()
Alamofire.request(imageLink).responseImage { response in
if let image = response.result.value {
self.imageView?.image = image
}
}
}
//cell configuration
cell.imageLink = "http://xxxxxxx.com/uploads/" + self.array[indexPath.row]["cover"] as! String)