1
let imgURL:NSURL = NSURL(string: "\(ImageName)")!

在上面一行,我遇到了致命错误

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

代码 :

let ImageName = obj["image"] as! String

 let imgURL:NSURL = NSURL(string: "\(ImageName)")!
 let request: NSURLRequest = NSURLRequest(URL: imgURL)

  let session = NSURLSession.sharedSession()

  let Imgtask = session.dataTaskWithRequest(request){
                            (data, response, error) -> Void in

   if (error == nil && data != nil)
    {
       func display_image()
       {
           pointAnnoation.DisplayImage = UIImage(data: data!)
        }
        dispatch_async(dispatch_get_main_queue(), display_image)
     }

   }

   Imgtask.resume()

从上面的代码我试图将我的图像从数据库中存储在注释中

如果我打印了“ImageName”,它会正确地从数据库中返回名称,但无法保留图像

它导致运行时出错。

4

4 回答 4

3

你这么说

如果我打印了“ImageName”,它会正确地从数据库中返回名称

那么这一定意味着ImageName对 URL 无效

如果你看它的描述NSURL(string:) 它说:

用于初始化 NSURL 对象的 URL 字符串。此 URL 字符串必须符合 RFC 2396 中描述的 URL 格式,并且不能为 nil。此方法根据 RFC 1738 和 1808 解析 URLString。

所以问题是……看起来怎么样ImageName?你能从中创建一个 URL 吗?

除此之外,使用?而不是!@PhillipMills 说的那样总是一个好主意

更新:我可以看到您现在发布了您的 URL 示例。如果我在操场上这样做:

let url = NSURL(string: " goo.gl/pBmA0d")

我得到nil了回报,所以看起来短 URLNSURL并不是最好的朋友。

更新 2:嗯,我猜我说得很快,如果你看上面你可以看到我在 goo.gl 部分之前有一个空格,如果我把它改成:

let url = NSURL(string: "goo.gl/pBmA0d")

它确实有效,我得到了一个NSURL对象。

但是我在您的代码中偶然发现了另一件事。您在此处声明ImageName为字符串:

let ImageName = obj["image"] as! String

所以你不必在\()以后包装它

let imgURL:NSURL = NSURL(string: "\(ImageName)")!

你可以简单地说:

让 imageURL = NSURL(string: ImageName)

然后......正如其他人所说,使用?而不是!

所以你可以写:

if let imageName = obj["image"] as? String,
   let imageURL = NSURL(string: imageName) {
   //we're in business :-)
}

安然无恙

于 2016-03-23T12:46:01.660 回答
2

尝试使用guardif let帮助自己。

let ImageName = obj["image"] as! String

 if let imgURL = NSURL(string: ImageName) {
     let request: NSURLRequest = NSURLRequest(URL: imgURL)

     let session = NSURLSession.sharedSession()

     let Imgtask = session.dataTaskWithRequest(request){ (data, response, error) -> Void in

        if (error == nil && data != nil)
        {
            // What's that func??
            func display_image()
            {
                pointAnnoation.DisplayImage = UIImage(data: data!)
            }
            dispatch_async(dispatch_get_main_queue(), display_image)
         }

       }
 }
 Imgtask.resume()
于 2016-03-23T12:44:54.730 回答
0

请尝试以下代码:

    //ImageName is a String type.

    guard  let ImageName = obj["image"] as? String , let imgURL = NSURL(string: ImageName) else{
        return 
    }
    let request: NSURLRequest = NSURLRequest(URL:imgURL)

    let session = NSURLSession.sharedSession()

    let Imgtask = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in

        if (error == nil && data != nil)
        {
            func display_image()
            {
                pointAnnoation.DisplayImage = UIImage(data: data!)
            }
            dispatch_async(dispatch_get_main_queue(), display_image)
        }

    Imgtask.resume()
于 2016-03-23T13:15:06.713 回答
0

不要强制展开...使用 if let 以避免崩溃...

 if let img = obj["image"] as? String, 
      imgURL = NSURL(string: img) {

     // ... continue with your code ...
 }
于 2016-03-23T12:39:13.767 回答