簡體   English   中英

完成處理程序在viewDidLoad中不起作用?

[英]Completion Handler is not working in viewDidLoad?

我在我的應用程序中使用此來設置橫幅廣告。 我試圖通過解析JSON來獲取鏈接。

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

您可能遇到了線程問題。 無法保證在主線程上調用Banners完成處理程序。 在執行任何觸及屬性或(特別是)接口的操作之前,您需要明確地跳到主線程。

我認為您的問題可能是您希望圖像立即可用,但之前需要先下載,因此在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)
            }
    }

}

你正在執行Banners fun循環
for index in 0 ... count-1 {let image:String = json [“image_path”] [index] .stringValue let source:AlamofireSource = AlamofireSource(urlString:image)! self.Banner.append(source)}在其他方法中替換此代碼並放置一個Optional
var image:String? = json [“image_path”] [index] .stringValue

或放置拇指圖像,這將使您確認圖像是否成功下載。

如果有效,請告訴我

謝謝,快樂編碼

也許你沒有看到圖像,因為你在輔助線程中更新它們,你必須在主線程中執行圖像更新; 在swift(performSelectorOnMainThread()不可用)中,您可以使用以下內容:

 dispatch_async(dispatch_get_main_queue(), {

                    myslideshow.updateimage();

 })

不太確定,但我猜測,因為你的圖像需要下載,當你調用self.slideshow.setImageInputs(self.Banner)時它們是零,它們在內部將圖像從列表設置為一個在視圖中添加的圖像self.slideshow.setImageInputs(self.Banner)滾動視圖。 所以我能想到的一種方法是使用SDWebImage將圖像設置為imageView ,以便在圖像准備好(下載)后更新相應的imageViews 我想你需要在setToImageView(_:)方法的InputSource.swift類中使用它。 你必須檢查這個,這是我能想到的唯一可能導致你的問題的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM