Swift Thread问题

时间:2017-07-23 17:33:21

标签: ios swift multithreading timer

我有一个功能,我从互联网下载图片,我把它放在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
        }

}

1 个答案:

答案 0 :(得分:2)

错误说明了一切。您应该在主线程上执行所有与UI相关的任务。 使用

获取主线程
DispatchQueue.main.async {
    //your UI Changes go here
}

在获得响应后,在此代码块中执行所有UI更改。