其他类

时间:2016-01-05 17:37:06

标签: ios swift

我正在尝试编写一个用于解析xml的类。我想在发生一些错误时显示警报。 这是我的代码:

Parse.swift

func parserXml(xmlUrl:String,completionHandler:([(staID: String, staName: String, ava: String, unava: String)]->Void)?)->Void{

    self.paraserCompletionHandler = completionHandler
    let request = NSURLRequest(URL: NSURL(string: xmlUrl)!)
    let urlConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
    urlConfig.timeoutIntervalForRequest = 30
    urlConfig.timeoutIntervalForResource = 60
    let urlSession = NSURLSession(configuration: urlConfig, delegate: self, delegateQueue: nil)

    let task = urlSession.dataTaskWithRequest(request, completionHandler: {(data,response,error)->Void in
        if error != nil{
            print(error?.localizedDescription)
            if (error?.code == NSURLErrorTimedOut || error?.code == NSURLErrorNotConnectedToInternet){
                let vc = ViewController()
                vc.alertView()
            }
        }else{
            let parser = NSXMLParser(data: data!)
            parser.delegate = self
            parser.parse()
        }            
    })
    task.resume()
}

ViewController.swift

func alertView(){
    var alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert)
    var okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default)
    self.presentViewController(alertController, animated: true, completion: nil)
}

当我运行我的应用时,我的应用崩溃并显示错误

  

致命错误:在解包可选值时意外发现nil

编辑:Xcode停在

self.presentViewController(alertController, animated: true, completion: nil)

我猜原因是ViewController.swift中的alertController被Parse.swift调用

任何人都可以解决这个问题吗? THX

1 个答案:

答案 0 :(得分:0)

在Parse.swift中抛出custom exception并在ViewController.swift中捕获它。您可以创建一个自定义类(NSException),在其中建立此exception并将其实现为两者。

如果不熟悉,则help处理异常。

if error {
    print(error?.localizedDescription)
    if (error?.code == NSURLErrorTimedOut ||
        error?.code == NSURLErrorNotConnectedToInternet){
        @throw [[CustomException alloc] initWithName:@"Title"
                                              reason:@"Message"
                                            userInfo:nil];
    }
} else{
            let parser = NSXMLParser(data: data!)
            parser.delegate = self
            parser.parse()
        }

ViewController try()调用parserXml(...)然后在catch()中,当您以这种方式发出警报时,您可以在parserXml(...)中抛出多个异常如果您想要显示多种错误类型,请使下一个语句完美。

catch (YourCustomException *ce) {
    alertController = UIAlertController(title: ce.name,
                                      message: ce.message,
                               preferredStyle: .Alert)
}