【问题标题】:Download image not being displayed iOS Swift下载图像不显示iOS Swift
【发布时间】:2017-08-23 10:56:48
【问题描述】:

我正在尝试下载图像并根据不同的条件显示它们。如果我只是在主线程中下载图像,该代码就可以工作,但我现在正试图通过后端下载它们。

我的控制台很干净,所以我没有收到任何错误 - 但我的图像没有显示?这是我第一次尝试进行后端图像下载,并且由于我来自 Objective-c,所以也进行了快速的操作。

有人可以看看下面的代码,让我知道问题所在吗?

//FizzBuzz Image Download
weak var fizzBuzzImage: UIImage!
let fizzBuzzString = "https://emkaydeum.files.wordpress.com/2015/08/fizzbuzz.png"
var fizzBuzzURL:NSURL!

//Fizz Image Download
weak var fizzImage: UIImage!
let fizzString = "https://vignette2.wikia.nocookie.net/leagueoflegends/images/b/b0/Fizz_Render.png/revision/latest?cb=20151205185848"
var fizzURL:NSURL!

//Buzz Image Download
weak var buzzImage: UIImage!
let buzzString = "https://vignette2.wikia.nocookie.net/disney/images/b/bc/Buzz_Disney_INFINITY_Render.png/revision/latest?cb=20140605182818"
var buzzURL:NSURL!

override func viewDidLoad() {
    super.viewDidLoad()

    fizzBuzzURL = NSURL(string: fizzBuzzString)
    fizzURL = NSURL(string: fizzString)
    buzzURL = NSURL(string: buzzString)
}

@IBAction func checkTextField(_ sender: UITextView){

    enteredValue = userInput.text

    let checkIfEmpty = userInput.text?.isEmpty

    if (checkIfEmpty == false) {
    let multipleOf3:Int = Int(enteredValue)!%3
    let multipleOf5:Int = Int(enteredValue)!%5

        if (multipleOf3 == 0 && multipleOf5 == 0) {
            fizzBuzz.text = "FizzBuzz"
            URLSession.shared.dataTask(with: (fizzBuzzURL as URL), completionHandler: {(fizzBuzzData, resp, error) -> Void in
                if (error != nil && fizzBuzzData != nil){
                    OperationQueue.main.addOperation ({
                        self.displayImage.image = UIImage(data: fizzBuzzData!)
                    })
                }
                }).resume()}
        else if (multipleOf5 == 0){
            fizzBuzz.text = "Buzz"
            URLSession.shared.dataTask(with: (buzzURL as URL), completionHandler: {(buzzData, resp, error) -> Void in
                if (error != nil && buzzData != nil){
                    OperationQueue.main.addOperation ({
                        self.displayImage.image = UIImage(data: buzzData!)
                })
                }
                }).resume()}
        else if (multipleOf3 == 0){
            fizzBuzz.text = "Fizz"
            URLSession.shared.dataTask(with: (fizzURL as URL), completionHandler: {(fizzData, resp, error) -> Void in
                if (error != nil && fizzData != nil){
                    OperationQueue.main.addOperation ({
                        self.displayImage.image = UIImage(data: fizzData!)
                })
                }
                }).resume()}
        else {
            fizzBuzz.text = "Incorrect Value"
            displayImage.image = nil
        }
    }
}

【问题讨论】:

  • 看看你添加的这个条件 if (error != nil && fizzBu​​zzData != nil) 你正在检查错误不能为 nil & data 不能为 nil。写成好像 (error == nil && fizzBu​​zzData != nil)
  • 不要在 Swift 中使用 NSURL,使用它的原生对应物 URL。你检查过你的 if 子句是否真的被命中了吗?
  • 不是说如果没有报错,并且数据源不为nil,那么就应该带着response继续函数?
  • 根据您的代码,这意味着错误对象具有一定的价值。为什么要使用 OperationQueue?如果你发现某个地方的主线程很忙,你可以使用 mainqueue 直接。
  • 谢谢加根!那解决了它。现在你已经解释过了——它确实有道理。非常感谢!

标签: ios swift image request nsurl


【解决方案1】:

请检查您的 IF 条件。你写了

if (error != nil && fizzBuzzData != nil){
                    OperationQueue.main.addOperation ({
                        self.displayImage.image = UIImage(data: fizzBuzzData!)
                    })
                }

从未执行。请按如下方式制作

 if (error == nil && fizzBuzzData != nil){
                    OperationQueue.main.addOperation ({
                        self.displayImage.image = UIImage(data: fizzBuzzData!)
                    })
                }

【讨论】:

    【解决方案2】:

    设置

    uiimageview contentMode 是 scaleAspectFill

    和 clipsToBounds 为真

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多