对成员' dataTask(with:completionHandler:)'的模糊引用连接到服务器

时间:2017-10-12 05:54:43

标签: ios json swift3 nsurlsession

我正在尝试连接服务器

如果你有解决方案,请为我写下来

我怎么知道更新版本的swift有哪些变化?

swift 2和swift 3之间存在很多差异

swift 4与swift 3有很大不同吗?

在swift 3中我收到此错误:

let task = URLSession.shared.dataTask(with: server.execute())
{Data,URLResponse,error in
    if error != nil{
    print(error as Any)
        return
    }
    do{
        let json = try JSONSerialization.jsonObject(with: Data!, options: .allowFragments)
        if let json_result = json as? [String: Any]
        {
            let result = json_result ["result"] as? String
            if result == "0"
            {
                DispatchQueue.main.async {
                    let alert = UIAlertController(title:"Incorrect Username",message : "The username you entered doesn't appear to belong to an account. Please check your username and try again", preferredStyle : .alert)
                    let alert_action = UIAlertAction(title: "Try Again", style: .default, handler: nil)
                    alert.addAction(alert_action)
                    self.present(alert, animated: true, completion: nil)
                }
            }
            else
            {
                DispatchQueue.main.async {
                    UserDefaults.standard.set(result!, forKey: "user_id")
                    //" use of unresolved identifier 'result' "
                    let current_view=UIApplication.shared.windows[0] as UIWindow
                    let new_view=(self.storyboard? .instantiateViewController(withIdentifier: "tab_bar"))! as UIViewController
                    UIView.transition(from: (current_view.rootViewController? .view)!, to:new_view.view , duration: 0.65, options: .transitionFlipFromRight, completion: {(action) in current_view.rootViewController=new_view
                    })
                }

            }
        }
        else{
            // Error in jsonSerialization
        }   }
    catch{
    }
}
task.resume()

1 个答案:

答案 0 :(得分:0)

问题几乎肯定是server.execute()的回报值。也许它是NSURLNSURLRequest而不是URLURLRequest。也许它是可选的。也许它完全不同。最重要的是,如果dataTask的参数不是非可选URLURLRequest,您可以得到错误。如果没有看到execute返回的内容,我们只是猜测,但它可能是罪魁祸首。

几个不相关的观察结果:

  1. 我不会将DataURLResponse用作dataTask闭包的参数名称。这些是数据类型的名称。我会使用dataresponse(或者甚至不指定response,因为您不使用它),而是为了避免混淆(对于您和编译器)。

  2. 你有很多无关的演员,只会给代码增加噪音。例如。 windowsUIWindow的数组,所以当您从该数组中获取第一项时,为什么还要费心as UIWindow

  3. 您有几个可选的链接序列,您稍后会强制解包。这样做没有意义。消除该过程中的可选链接。因此,而不是storyboard?后跟!

    let new_view = (self.storyboard?.instantiateViewController(withIdentifier: "tab_bar"))! as UIViewController
    

    您可以使用storyboard!

    let controller = self.storyboard!.instantiateViewController(withIdentifier: "tab_bar")
    
  4. 如果您愿意,您可以删除几个无关的选项。例如。 .allowFragments JSONSerialization是不必要的(也可能是不受欢迎的)。或者completionnil的{​​{1}} UIAlertAction也是不必要的。没什么大不了的,但它只会给代码增加噪音。

  5. 按照惯例,我们不会使用present字符来分隔变量名称中的字词。我们使用camelCase。因此,例如,我们使用_而不是current_view。 (或者,因为那是一个窗口,我实际上使用currentView,这更简单。)

  6. 如果你在window块中没有做任何事情,那么使用do - try - catch模式是没有意义的。如果你在捕获它时不会做任何事情,为什么会抛出错误。如果您关心的是否成功,只需使用catch

  7. 因此,可以将代码清理一下,例如:

    try?

    现在,我已将let task = URLSession.shared.dataTask(with: request) { data, _, error in if let error = error { print(error) return } guard let data = data, let json = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any], let result = json["result"] as? String else { print("no result") return } DispatchQueue.main.async { if result == "0" { let alert = UIAlertController(title: "Incorrect Username", message: "The username you entered doesn't appear to belong to an account. Please check your username and try again", preferredStyle: .alert) let action = UIAlertAction(title: "Try Again", style: .default) alert.addAction(action) self.present(alert, animated: true) } else { UserDefaults.standard.set(result, forKey: "user_id") let window = UIApplication.shared.windows[0] let controller = self.storyboard!.instantiateViewController(withIdentifier: "tab_bar") UIView.transition(from: window.rootViewController!.view, to: controller.view, duration: 0.65, options: .transitionFlipFromRight, completion: { _ in window.rootViewController = controller }) } } } task.resume() 替换为server.execute(),因为我不知道request正在做什么,但请使用适当的内容(请参阅此开头)回答)。