完成处理程序不能在viewDidLoad中工作?

问题描述:

我在我的横幅广告中使用此library。我试图通过解析JSON来获取链接。完成处理程序不能在viewDidLoad中工作?

图像不显示在slideshow视图。如果我按slideshow视图,之后,一切工作正常。我认为我的完成处理程序存在一些问题。 但我还没有解决:)

@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) 
    } 
+0

ü可以共享代码在'click'方法 – uchiha

+0

@uchiha我将它 – user3467240

+1

什么代码风格! ! –

你可能有一个线程问题。不能保证Banners完成处理程序在主线程中被调用。在做任何接触你的属性或特别是接口的东西之前,你需要明确地走出主线程。

+0

你可以在代码中显示我吗? – user3467240

+0

如果我没有错,Alamofire在主线程中调用响应,所以在这种情况下交换机可能不是问题的原因。 – uchiha

+0

@uchiha你可能是对的,但我经常看到这种事情 - 界面无法更新,直到触及 - 原因总是一个线程问题,所以这似乎是一个合理的猜测。 – matt

不太确定,但我猜测由于您的图片需要下载,因此当您拨打self.slideshow.setImageInputs(self.Banner)时,它们为零,它会在内部将列表中的图像设置为在scrollView中添加的图像视图。因此,我可以想到的一种方法是使用SDWebImage将图像设置为imageView,以便在图像准备好(下载)后更新相应的imageView。我想你需要在setToImageView(_:)方法中的InputSource.swift类中使用它。你必须检查这个,但这是唯一可能的问题,我可以想到,这可能会导致你的问题。

+0

这里的图书馆(用于问题)是用于幻灯片放映而不是图片下载。建议的库用于异步图像下载,这是解决该问题的可能方案。在添加误导性评论和降低投票之前,请通过图书馆。 – uchiha

+0

显示一些代码 – user3467240

我认为你的问题可能是你期望的图像立即可用,但他们需要以前下载,所以他们不会立即在viewDidLoad方法完成后立即可用。这就是为什么你应该在viewDidLoad而不是你的bannershow()方法中配置你的幻灯片。像这样的东西可能是一个改进:

@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) 
} 

移动代码viewWillAppear中

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) 
      } 
    } 

}

您在横幅乐趣0
索引for循环执行...计数1 { 让图像:字符串= JSON [ “IMAGE_PATH”] [指数] .stringValue 让源:AlamofireSource = AlamofireSource(urlString:image)! self.Banner.append(source) } 用其他方法替换此代码并放置一个可选
var image:String? = json [“image_path”] [index] .stringValue

或放置一个缩略图,这会让你确认图像下载是否成功。

让我知道,如果它

谢谢,快乐编码

也许你看不到图像,因为你在辅助线程更新它们,你必须执行在主线程图像更新; 在SWIFT(performSelectorOnMainThread()不可用),你可以使用这样的事情:

dispatch_async(dispatch_get_main_queue(), { 

        myslideshow.updateimage(); 

})