致命错误:在展开可选值NSURL时意外发现nil

时间:2016-05-17 07:22:20

标签: ios swift null uiimage nsurl

我收到零错误。但我不明白为什么开心。我可以通过打印获得选择的照片名称。但我不能在NSUrl中使用。你能帮帮我吗?

我的代码:

    print(selectedPhoto)

    if selectedPhoto != nil
    {
        let photoUrl = NSURL(string: "http://www.kerimcaglar.com/uploads/yemek-resimler/\(selectedPhoto)")
        print("photo url: \(photoUrl)")
        dataPhoto = NSData(contentsOfURL:photoUrl!)
        yemekResim.image = UIImage(data: dataPhoto!)
    }

    else
    {
        print("Error")
    }

2 个答案:

答案 0 :(得分:2)

来自NSData上的Apples文档(contentsOfURL)

  

请勿使用此同步方法来请求基于网络的网址。对于基于网络的URL,此方法可以在慢速网络上阻止当前线程持续数十秒,从而导致用户体验不佳,而在iOS中,可能会导致应用程序被终止。

如果你的应用因此崩溃,它将被拒绝从商店。

相反,你应该使用NSURLSession。使用我的示例中的Async回调块。 强制解包选项!也不是一个好主意,因为你会得到运行时错误,而不是使用if let语法

请参阅下面的示例。

if let photo = selectedPhoto{
            let photoUrl = NSURL(string: "http://www.kerimcaglar.com/uploads/yemek-resimler/\(photo)")
            if let url = photoUrl{
                NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {(data, response, error) in
                    if let d = data{
                        dispatch_async(dispatch_get_main_queue(), {
                            if let image = UIImage(data: d) {
                                self.yemekResim.image = image
                            }
                        })


                    }
                }).resume()
            }
        }
    }

答案 1 :(得分:0)

替换它:

let photoUrl = NSURL(string: "http://www.kerimcaglar.com/uploads/yemek-resimler/\(selectedPhoto)")

用这个:

let photoUrl = NSURL(string: "http://www.kerimcaglar.com/uploads/yemek-resimler/\(selectedPhoto!)")

(注意"!"在selectedPhoto之后)