我正在尝试使用Alomofire和swiftyJSON从json加载图像。 Json是字典:
{"name": {"image": "https://...",}}
Alamorefire和SwiftyJSON
var imageLoad: String!
Alamofire.request(.GET, url).responseJSON { (response) -> Void in
if let value = response.result.value {
let json = JSON(value)
if let jsonDict = json.dictionary {
let image = jsonDict["name"]!["image"].stringValue
print(image) // https://....
self.imageLoad = image
}
self.tableView.reloadData()
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TVCell
// Configure the cell...
cell.imageTableView.image = UIImage(named: imageLoad) // not working "fatal error: unexpectedly found nil while unwrapping an Optional value"
如果有人可以提供帮助?如果有其他方式可以自由写作。
答案 0 :(得分:3)
如果您使用Alamofire
,请尝试AlamofireImage
。但是直接在uiimageview上使用af_
快捷方式。自动您将获得缓存,占位符图像,并且如果您使用可以回收单元格的表视图,则可以取消未完成的请求。
通过指定占位符图像,图像视图使用占位符图像,直到下载远程图像。
let imageView = UIImageView(frame: frame)
let url = URL(string: "https://httpbin.org/image/png")!
let placeholderImage = UIImage(named: "placeholder")!
imageView.af_setImage(withURL: url, placeholderImage: placeholderImage)
答案 1 :(得分:2)
我分享了使用 Swift 3 和 AlamofireImage 实现的代码:
import UIKit
import AlamofireImage
class MovieViewCell: UICollectionViewCell {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var overviewLabel: UILabel!
@IBOutlet weak var posterView: UIImageView!
func configure(for movie: Movie) {
titleLabel.text = movie.title
overviewLabel.text = movie.overview
let url = URL(string: movie.poster_path!)!
posterView.af_setImage(withURL: url)
}
override func prepareForReuse() {
super.prepareForReuse()
posterView.af_cancelImageRequest()
posterView.image = nil
}
}
此外,您需要 Cocoapods :
platform :ios, '10.0'
inhibit_all_warnings!
use_frameworks!
target 'MovieApp' do
pod 'Alamofire', '~> 4.5'
pod 'AlamofireImage', '~> 3.3'
end
答案 2 :(得分:1)
从alamofire swift3的tableview单元格中的url加载图片: -
//你需要安装pod' AlamofireImage','〜> 3.0'pod
import Alamofire
import AlamofireImage
// put into cellForRowAt
Alamofire.request(self.profileImgArr[indexPath.row]).responseData { (response) in
if response.error == nil {
print(response.result)
// Show the downloaded image:
if let data = response.data {
cell.profileImg.image = UIImage(data: data)
}
}
}
答案 3 :(得分:1)
我建议使用不同的库来加载图像。我们总是在我们的项目中这样做。
有一个简单而智能的库,可以处理从缓存到占位符图像的所有内容。
它的名字叫翠鸟 https://github.com/onevcat/Kingfisher
您可以使用JSON中的URL直接在ImageView上使用它 例如:
let url = URL(string: "url_of_your_image")
imageView.kf.setImage(with: url)
这是最基本的异步图像加载方法,
自己看看:)
答案 4 :(得分:0)
如果您已经在使用Alamofire
,则可以尝试AlamofireImage
这是Alamofire
的图片组件库。
然后,提取图像就像这样:
import AlamofireImage
Alamofire.request(.GET, "https://httpbin.org/image/png")
.responseImage { response in
if let image = response.result.value {
print("image downloaded: \(image)")
}
}
答案 5 :(得分:0)
正如Bear with me所说,你可以使用AlamofireImage,
https://github.com/Alamofire/AlamofireImage
我为Swift 3做了这个,希望它可以帮助:
在实现tableViewDataSource
的控制器中func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell
NetworkService.shared.requestImage(path: path, completionHandler: {image in
cell.photo?.image = image
})
}
return cell
}
在我的NetworkService中(我使用共享来实现单例,就像getInstance)我实现了调用AlamofireImage的requestImage函数:
func requestImage(path: String, completionHandler: @escaping (Image) -> Void){
Alamofire.request("\(path)").responseImage(imageScale: 1.5, inflateResponseImage: false, completionHandler: {response in
guard let image = response.result.value else{
print(response.result)
return
}
DispatchQueue.main.async {
completionHandler(image)
}
})
}
正如您所看到的,我使用GCD作为主队列来管理completionHandler,以确保它是处理视图修改的主队列。