[英]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.