我有一个功能,我从互联网下载图片,我把它放在UIImage内,它还添加了一个网站(UIButton)。 Urls存储在我的数据库中,我将它们存储在一个数组中。然后我生成一个随机数来获取索引并使用它来下载图片。我在viewDidLoad中运行代码并显示图片,如果单击它,则会打开网页。我也使用计时器每5秒重复一次这个功能,所以我希望它能显示不同的图片和网站。
不幸的是它一直显示相同的图片(网页已更改)并且偶尔会更改图片,但在控制台中显示此消息“此应用程序正在修改引擎后的后台线程中的autolayout引擎从主线程访问。这可能导致引擎损坏和奇怪的崩溃。“
如何使此功能正常工作?我提前感谢你们。我的代码如下
func descargaPicture(){
do {
let defaults = UserDefaults.standard
let miCIudad = defaults.object(forKey: "ciudad") as! String
let query = tblAd.filter(ciudad == miCIudad)
for infoAd in try conn.db!.prepare(query) {
//Guardar en arreglos
if(imagen.contains(infoAd[fotoAd]!)) {
print("ya existe")
} else {
imagen.append(infoAd[fotoAd]!)
}
if(web.contains(infoAd[webAd]!)){
} else {
web.append(infoAd[webAd]!)
}
} //Termina for
//-------------------------Descarga foto Internet-------------------------------
/*
Este proceso es similar a los anteriores, lo que hacemos es, después de obtener la imagen de nuestra BD, procedemos a hacer una petición para descargar la imagen del internet, así para poder después usarla como banner/Ad en determinadas Views, por lo que este bloque de código se encuentra presente en unas pocas clases de nuestro proyecto.
*/
let numero = imagen.count-1
if numero <= 0 {
print("El array esta vacio")
return
}
else {
var filtro = Int (arc4random_uniform(UInt32(numero)+1))
if imagen[filtro] != "" {
let picture = URL(string: self.imagen[filtro])!
let session = URLSession(configuration: .default)
let downloadPicTask = session.dataTask(with: picture) {(data, response, error) in
if let e = error {
print("Erro al descargar la imagen: \(e)")
}
else {
self.imagenAd.image = nil //-----------
if let res = response as? HTTPURLResponse {
print("Descargando foto, respuesta: \(res.statusCode)") //Da 200 como resp.
if let imageData = data {
let imagen = UIImage(data: imageData as Data)
self.imagenAd.image = imagen
self.webSite = self.web[filtro]
}
else {
print("No se puede obtener imagen")
}
}
else {
print("No se obtiene respuesta del servidor")
}
}
}
downloadPicTask.resume()
}
else {
print("Es NIL")
return
}
} //Cerramos el else definitivo
//--------------------/Descarga foto Internet ------------------------------
} //do
catch {
//Errores
}
}
答案 0 :(得分:2)
错误说明了一切。您应该在主线程上执行所有与UI相关的任务。 使用
获取主线程DispatchQueue.main.async {
//your UI Changes go here
}
在获得响应后,在此代码块中执行所有UI更改。