ImageView 只能在主线程中使用
ImageView must be used from main thread only
我正在从我的 firebase 数据库中获取一个 url 来下载图像,并且在主线程中的 cell.articleImage.image = UIImage(data: data) 上收到此错误,它没有崩溃但它不会 return 图片,有人知道哪里出了问题吗?
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
DispatchQueue.global().async {
let v = UIView(frame: .zero)
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "articleCell") as? articlesCell else {
return UITableViewCell()}
let article = articleArray[indexPath.row]
let url = URL(string: article.imageURL)!
DispatchQueue.global().async {
do{
let data = try Data(contentsOf: url)
DispatchQueue.global().sync {
cell.articleImage.image = UIImage(data: data)
}
} catch {
}
}
// cell.articleImage.sd_setImage(with: url, placeholderImage: UIImage(named: "issaimage"))
cell.configureCell(title: article.ArticleTitle, author: article.author, date: article.date)
return cell
}
您在全局而不是主队列中执行此操作,因此请更改此
DispatchQueue.global().sync {
cell.articleImage.image = UIImage(data: data)
}
到
DispatchQueue.main.sync {
cell.articleImage.image = UIImage(data: data)
}
//
同样,SDWebImage 是最好的选择,因为使用这种方法,每次滚动都会下载图像
//
也在你的viewDidLoad
DispatchQueue.global().async { // should be in main queue
let v = UIView(frame: .zero) // whatever UI is here
}
试试这个方法
func openImageGallery() {
DispatchQueue.main.async {
self.picker.delegate = self
self.picker.allowsEditing = true
self.picker.sourceType = .photoLibrary
self.present(self.picker, animated: true, completion: nil)
}
}
我正在从我的 firebase 数据库中获取一个 url 来下载图像,并且在主线程中的 cell.articleImage.image = UIImage(data: data) 上收到此错误,它没有崩溃但它不会 return 图片,有人知道哪里出了问题吗?
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
DispatchQueue.global().async {
let v = UIView(frame: .zero)
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "articleCell") as? articlesCell else {
return UITableViewCell()}
let article = articleArray[indexPath.row]
let url = URL(string: article.imageURL)!
DispatchQueue.global().async {
do{
let data = try Data(contentsOf: url)
DispatchQueue.global().sync {
cell.articleImage.image = UIImage(data: data)
}
} catch {
}
}
// cell.articleImage.sd_setImage(with: url, placeholderImage: UIImage(named: "issaimage"))
cell.configureCell(title: article.ArticleTitle, author: article.author, date: article.date)
return cell
}
您在全局而不是主队列中执行此操作,因此请更改此
DispatchQueue.global().sync {
cell.articleImage.image = UIImage(data: data)
}
到
DispatchQueue.main.sync {
cell.articleImage.image = UIImage(data: data)
}
//
同样,SDWebImage 是最好的选择,因为使用这种方法,每次滚动都会下载图像
//
也在你的viewDidLoad
DispatchQueue.global().async { // should be in main queue
let v = UIView(frame: .zero) // whatever UI is here
}
试试这个方法
func openImageGallery() {
DispatchQueue.main.async {
self.picker.delegate = self
self.picker.allowsEditing = true
self.picker.sourceType = .photoLibrary
self.present(self.picker, animated: true, completion: nil)
}
}