Swift NSJSONSerialization.JSONObjectWithData不处理空数据

时间:2016-07-13 13:19:44

标签: swift swift2

我有一个从mySQL服务器下载数据的数据下载器类。 我遇到的问题是当结果为null时 - 应用程序崩溃并显示错误消息

  

无法转换类型' __ NSArray0'的值(0x105548918)到' NSMutableArray' (0x105549c00)。

class userDetailsDownloader: NSObject, NSURLSessionDataDelegate {

  weak var delegate: getUserDetails!
  var data : NSMutableData = NSMutableData()

  func downloadUserDetails(userEmail: String) {

    let urlPath: String = "http://intouchmobile.co/phpscripts/getuserpassword.php?email=\(userEmail)"
    let url: NSURL = NSURL(string: urlPath)!
    var session: NSURLSession!
    let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration() //defaultSessionConfiguration()
    session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
    let task = session.dataTaskWithURL(url)
    task.resume()
  }

  func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
    self.data.appendData(data);

  }

  func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
    if error != nil
    {
        print("Failed to get password")
    }
    else
    {
        self.parseJSON()
        print("Password Received")
    }

  }
  func parseJSON() {

    var jsonResult: NSMutableArray = NSMutableArray()
    var password: String!
    var firstName: String!
    var lastName: String!


    do{
        jsonResult = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions.AllowFragments) as! NSMutableArray


    } catch let error as NSError {
        print(error)
    }
}

2 个答案:

答案 0 :(得分:1)

不要说as! NSMutableArray。术语as! 意味着"让我崩溃",所以当你崩溃时你几乎不会感到惊讶。说as? NSMutableArray。测试nil的结果。如果是nil,请停止。

if let jsonResult = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions.AllowFragments) as? NSMutableArray {
    self.jsonResult = jsonResult
}

你可能仍然有问题,因为这永远不会是一个可变阵列;它只是一个阵列。所以您可能需要将其更改为:

if let jsonResult = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions.AllowFragments) as? NSArray {
    self.jsonResult = NSMutableArray(array: jsonResult)
}

(但是,正如vadian在评论中所说,如果您可以放弃使用NSArray和NSMutableArray并使用Swift类型,那将会更好。)

答案 1 :(得分:0)

试试这样。

if NSJSONSerialization.isValidJSONObject(data) {
   //your do catch
}

这应该可以解决你的问题。