Swift中断链接的NSURL错误

时间:2014-11-10 09:30:22

标签: macos swift nsurl

我为OSX 10.10编写了一个函数,该函数愿意从URL打开文本文件并显示其内容。

一切正常,但如果无法访问该网址,则应用会崩溃。我怎么能处理这种类型的错误? 我猜它来自completionHandler闭包,但我不确定。

这是我的代码

@IBAction func checkAdminMessage(sender: NSMenuItem) {


    let messageURL = NSURL(string: "http://www.xxxxxx.com/text.txt")

    // The Network stuff will be handled in a background thread
    let sharedSession = NSURLSession.sharedSession()
    let downloadTask: NSURLSessionDownloadTask = sharedSession.downloadTaskWithURL(messageURL!,
        completionHandler: {
            (location: NSURL!, response: NSURLResponse!, error: NSError!) -> Void in

            var urlContents = NSString(contentsOfURL: location, encoding: NSUTF8StringEncoding, error: nil)


            // Check if text.txt has NULL as content
            if urlContents! == "NULL" {


                // Have to use Grand Central Dispatch to put NSAlert in the main thread
                let noMessage = NSLocalizedString("Nothing there", comment: "Text to dislay when the file is empty" )

                dispatch_async(dispatch_get_main_queue()) { () -> Void in
                    self.displayAlertNotification(notification: noMessage)

                }

            } else {
                // If the file is not empty then we display the content of this file
                dispatch_async(dispatch_get_main_queue()) { () -> Void in
                    self.displayAlertNotification(notification: urlContents!)
                }

            }
    })
    downloadTask.resume()
}

谢谢

编辑:这是更新的代码,但应用程序仍然崩溃

@IBAction func checkAdminMessage(sender: NSMenuItem) {

 if let messageURL = NSURL(string: "http://www.xxxxxx.com/text.txt") {
        let sharedSession = NSURLSession.sharedSession()


        let downloadTask: NSURLSessionDownloadTask = sharedSession.downloadTaskWithURL(messageURL,
            completionHandler: {
                (location: NSURL!, response: NSURLResponse!, error: NSError!) -> Void in

                var urlContents = NSString(contentsOfURL: location, encoding: NSUTF8StringEncoding, error: nil )


                if urlContents == "NULL" {

                    println(urlContents)
                    // Have to use Grand Central Dispatch to put NSAlert in the main thread
                    let noMessage = NSLocalizedString("Nothing there", comment: "Text to dislay when the file is empty" )

                    dispatch_async(dispatch_get_main_queue()) { () -> Void in
                        self.displayAlertNotification(notification: noMessage)
                    }
                }
                else {
                    dispatch_async(dispatch_get_main_queue()) { () -> Void in
                        self.displayAlertNotification(notification: urlContents!)
                    }
                }


        })
        downloadTask.resume()

    }
    else {
        println("Error")
    }

}

2 个答案:

答案 0 :(得分:0)

NSURL(string: ...)会返回一个可选项,因此原因可能是nil

将您的代码包装在有条件的展开中:

if let messageURL = NSURL(string: "http://www.xxxxxx.com/text.txt") {
    // success
    ...
}
else {
   // error
}

答案 1 :(得分:0)

我在评论我的问题的人的帮助下想出来了。

我在downloadTaskWithUrl中从'location'得到一个nil,然后var urlContents也收到了一个nil。

解决方案是检查'location'是否为nil:

        let downloadTask: NSURLSessionDownloadTask = sharedSession.downloadTaskWithURL(messageURL,
            completionHandler: {
                (location: NSURL!, response: NSURLResponse!, error: NSError!) -> Void in

                **if (location != nil) {**


                var urlContents = NSString(contentsOfURL: location, encoding: NSUTF8StringEncoding, error: nil ) ...