2016-10-03 78 views
2

我有这个方法在Swift 2.2中工作,但自从我将代码转换为Swift 3后,它不再有效,此方法所做的就是取用户名和密码登录到Windows身份验证的URL中,如果信誉正确,则返回true,如果它们不正确,则返回false。致命错误:意外地发现零,同时解开URLSession的可选值

这里是方法:

func loginUser(_ username: String, password: String, completion: @escaping (_ result: Bool) -> Void) 
    { 
     //Setup the NSURLSessionConfiguration 

     let configuration = URLSessionConfiguration.default 

     //Setup the NSURLSession 

     let session = Foundation.URLSession(configuration: configuration, delegate: self, delegateQueue: nil) 

     //Add the username and password to NSURLCredential 

     credential = URLCredential(user:username, password:password, persistence: .forSession) 

     //Create request URL as String 

     let requestString = NSString(format:"%@", webservice) as String 

     //Convert URL string to NSURL 

     let url: URL! = URL(string: requestString) 

     //Prepare the task to get data. 

     let task = session.dataTask(with: url, completionHandler: { 
      data, response, error in 

      DispatchQueue.main.async(execute: { 

       if(error == nil) 
       { 

        //If there is no error calling the API, return true 

        completion(true) 
       } 
       else 
       { 

        //If there is an error calling the API, return false 

        completion(false) 
       } 

      }) 

     }) 

     //Run the task to get data. 

     task.resume() 

    } 

,我得到这个错误:

fatal error: unexpectedly found nil while unwrapping an Optional value 

这种情况发生时就在这里:

let task = session.dataTask(with: url, completionHandler: { 
      data, response, error in 

      DispatchQueue.main.async(execute: { 

       if(error == nil) 
       { 

        //If there is no error calling the API, return true 

        completion(true) 
       } 
       else 
       { 

        //If there is an error calling the API, return false 

        completion(false) 
       } 

      }) 

     }) 

我在做什么错?

这出现在我的调试导航器中的致命错误之前:

function signature specialization <preserving fragile attribute, Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) ->() to @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out()), Argument Types : [@callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) ->()]> of generic specialization <preserving fragile attribute,()> of Swift.StaticString.withUTF8Buffer <A> ((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A 

我相信我的问题是在这里:

/** 
    Requests credentials from the delegate in response to a session-level authentication request from the remote server. 
    */ 

    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 

     if challenge.previousFailureCount > 0 
     { 
      completionHandler(Foundation.URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge, nil) 
     } 
     else 
     { 
      completionHandler(Foundation.URLSession.AuthChallengeDisposition.useCredential, URLCredential(trust:challenge.protectionSpace.serverTrust!)) 
     } 

    } 

    /** 
    Requests credentials from the delegate in response to an authentication request from the remote server. 
    */ 

    func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 

     completionHandler(Foundation.URLSession.AuthChallengeDisposition.useCredential,credential) 

    } 

它不喜欢这些方法。

+0

例如,如果它的工作,我会接受你的答案。 – user979331

+1

'url'可能是零。 'requestString'的价值是什么? – dan

+0

url与requestString不是零,它不是零 – user979331

回答

-1

变化从

let url: URL! = URL(string: requestString) 

到URL声明:

let url: URL = URL(string: requestString)! 

这本身就可能解决它;或者它会显示你的requestString不好。

+0

这没有奏效,它并没有解决我的问题 – user979331

0

这个答案适用于那些有这个问题但方式不同的人。
这是我面临和修复: 我有一个搜索字段在tableview中查看一些结果。
它通过数字或删除单词崩溃并尽可能快地进行数字化。 我把一个例外断点,但没有显示它崩溃的地方。因此,一个在胎面回来,并开始在此:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "iTableViewCell", for: indexPath) as! MyClassTableViewCell 
    cell.setCellFood(with: self.elementsArray[indexPath.row]) // <-- HERE 
    return cell 
} 

但是,到那里digiting时,从这里开始:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    self.elementsArray.removeAll() // <-- Last thing debbuging i found stop here 

    DispatchQueue.main.asyncAfter(deadline: .now()) { 
     if textField == self.txtSearch && (textField.text?.characters.count)! > 3 { 
      let predicate = NSPredicate(format: "status = 'A' AND name CONTAINS [cd] %@", textField.text!) 
      let filtered = MyObjectRealm().get(withFilter: "", predicate: nil, nsPredicate: predicate) 
      filtered.forEach({ (food) in 
       self.elementsArray.append(food) 
       self.reloadAllDataCustom() 
      }) 
     }else{ 
      self.elementsArray = MyObjectRealm().get(withFilter: "status = 'A'") 
      self.reloadAllDataCustom() 
     } 
    } 

    return true 
} 

所以,当它删除所有元素,它崩溃!
问题是DispatchQueue.main.asyncAfter(deadline: .now())
它有一个.now() + 0.2达拉然后,它没有时间重新加载元素,导致崩溃!
现在它是实时擦除和填充,永远不会再崩溃,因为它填充单元格时永远不会返回零。

希望可以帮助别人解决问题并找到错误!

相关问题