完成处理程序不能在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)
}
你可能有一个线程问题。不能保证Banners完成处理程序在主线程中被调用。在做任何接触你的属性或特别是接口的东西之前,你需要明确地走出主线程。
你可以在代码中显示我吗? – user3467240
如果我没有错,Alamofire在主线程中调用响应,所以在这种情况下交换机可能不是问题的原因。 – uchiha
@uchiha你可能是对的,但我经常看到这种事情 - 界面无法更新,直到触及 - 原因总是一个线程问题,所以这似乎是一个合理的猜测。 – matt
不太确定,但我猜测由于您的图片需要下载,因此当您拨打self.slideshow.setImageInputs(self.Banner)
时,它们为零,它会在内部将列表中的图像设置为在scrollView中添加的图像视图。因此,我可以想到的一种方法是使用SDWebImage将图像设置为imageView,以便在图像准备好(下载)后更新相应的imageView。我想你需要在setToImageView(_:)
方法中的InputSource.swift
类中使用它。你必须检查这个,但这是唯一可能的问题,我可以想到,这可能会导致你的问题。
这里的图书馆(用于问题)是用于幻灯片放映而不是图片下载。建议的库用于异步图像下载,这是解决该问题的可能方案。在添加误导性评论和降低投票之前,请通过图书馆。 – uchiha
显示一些代码 – 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();
})
ü可以共享代码在'click'方法 – uchiha
@uchiha我将它 – user3467240
什么代码风格! ! –