Completion Handler no funciona en viewDidLoad?

Estoy usando esta biblioteca en mi aplicación para banners. Estoy intentando get el enlace parsing el JSON.

Las imágenes no se muestran en la vista de slideshow . Si presiono la vista de slideshow , después de eso todo funciona bien. Pensé que había algún problema con mi manejador de finalización. Pero aún no puedo resolverlo 🙂

 @IBOutlet weak var slideshow: ImageSlideshow! var transitionDelegate: ZoomAnimatedTransitioningDelegate? var Banner : [AlamofireSource] = [] override func viewDidLoad() { super.viewDidLoad() Banners { (imagesource) in if imagesource != nil { self.bannershow() } } } func Banners(completionHandler: ([AlamofireSource]?) -> ()) -> (){ Alamofire.request(.GET, "http://46.420.116.11/mobileapp/gps/api.php?rquest=get_banners") .responseJSON{ response in if let data = response.result.value{ let json = JSON(data) let count = json["image_path"].count for index in 0...count-1 { let image :String = json["image_path"][index].stringValue let source : AlamofireSource = AlamofireSource(urlString: image)! self.Banner.append(source) } completionHandler(self.Banner) } } } func bannershow(){ self.slideshow.backgroundColor = UIColor.whiteColor() self.slideshow.slideshowInterval = 2.0 self.slideshow.contentScaleMode = UIViewContentMode.ScaleToFill self.slideshow.setImageInputs(self.Banner) let recognizer = UITapGestureRecognizer(target: self, action: "click") self.slideshow.addGestureRecognizer(recognizer) } func click() { let ctr = FullScreenSlideshowViewController() ctr.pageSelected = {(page: Int) in self.slideshow.setScrollViewPage(page, animated: false) } ctr.initialPage = slideshow.scrollViewPage ctr.inputs = slideshow.images self.transitionDelegate = ZoomAnimatedTransitioningDelegate(slideshowView: slideshow); ctr.transitioningDelegate = self.transitionDelegate! self.presentViewController(ctr, animated: true, completion: nil) } 

Probablemente tenga un problema de subprocesamiento. No hay garantía de que se llame al manejador de finalización de Banners en el hilo principal. Debe salir explícitamente al hilo principal antes de hacer cualquier cosa que toque sus properties o (especialmente) la interfaz.

Creo que tu problema podría ser que esperas que las imágenes estén disponibles de inmediato, pero deben downloadse antes, por lo que no estarán disponibles inmediatamente después de que viewDidLoad método viewDidLoad . Es por eso que probablemente debería configurar su presentación de diapositivas en viewDidLoad y no en su método bannershow() . Algo como esto podría ser una mejora:

 @IBOutlet weak var slideshow: ImageSlideshow! var bannerImages : [AlamofireSource] = [] override func viewDidLoad() { super.viewDidLoad() slideshow.backgroundColor = UIColor.whiteColor() slideshow.slideshowInterval = 2.0 slideshow.contentScaleMode = UIViewContentMode.ScaleToFill let recognizer = UITapGestureRecognizer(target: self, action: "click") slideshow.addGestureRecognizer(recognizer) getBanners { imagesource in self.showBanner() } } func getBanners(completionHandler: ([AlamofireSource]?) -> ()) -> (){ Alamofire.request(.GET, "http://46.420.116.11/mobileapp/gps/api.php?rquest=get_banners") .responseJSON{ response in if let data = response.result.value{ let json = JSON(data) let count = json["image_path"].count for index in 0...count-1 { let image :String = json["image_path"][index].stringValue let source : AlamofireSource = AlamofireSource(urlString: image)! self.bannerImages.append(source) } } completionHandler(self.bannerImages) } } func showBanner() { slideshow.setImageInputs(bannerImages) } 

Mueva el código para verlo .

 override func viewWillAppear(animated: Bool) { Banners { (imagesource) in if imagesource != nil { self.bannershow() } } } 
 func Banners(completionHandler: ([AlamofireSource]?) -> ()) -> (){ Alamofire.request(.GET, "http://46.420.116.11/mobileapp/gps/api.php?rquest=get_banners") .responseJSON{ response in if let data = response.result.value{ let json = JSON(data) let count = json["image_path"].count for index in 0...count-1 { let image :String = json["image_path"][index].stringValue let source : AlamofireSource = AlamofireSource(urlString: image)! self.Banner.append(source) } completionHandler(self.Banner) } } 

}

Estás ejecutando para loop en Banners diversión
para el índice en 0 … count-1 {dejar image: String = json ["image_path"] [index] .stringValue dejar fuente: AlamofireSource = AlamofireSource (urlString: image)! self.Banner.append (source)} Reemplace este código en algún otro método y coloque un Opcional
var image: cadena? = json ["ruta_image"] [índice] .stringValue

o coloque una image en el pulgar, eso hará que confirme que la image se ha descargado correctamente o no.

Déjame saber si funciona

Gracias, feliz codificacion

Tal vez no ve imágenes porque las actualiza en un hilo secundario, debe realizar la actualización de la image en el hilo principal; En swift (performSelectorOnMainThread () no está disponible), puede usar algo como esto:

  dispatch_async(dispatch_get_main_queue(), { myslideshow.updateimage(); }) 

No estoy seguro, pero supongo que ya que tus imágenes necesitan downloadse, son nulas cuando llamas a self.slideshow.setImageInputs(self.Banner) , que establece internamente la image de la list en una image que se agrega dentro de la scrollView Entonces, una forma en que puedo pensar es usar SDWebImage para configurar la image en imageView para que actualice las imágenes respectivas una vez que la image esté list (descargada). Creo que necesitarás usarlo en la class InputSource.swift en el setToImageView(_:) . Sin embargo, tendrá que verificar esto, este es el único problema posible que podría haber causado su problema.