2017-10-12 46 views
-1
func datakontrol(){ 

let url = NSURL(string: "http://localhost.192.168.1.40.xip.io:8888/store1.php") 
URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in 

    if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary { 

     guard let telefon = jsonObj!["telefon"] as? String else { return } 
     GlobalVariables.telefonum = telefon 
    } 
}).resume() 

当我尝试跟踪此代码从dataTask跳到代码结束。我想问一个错误的问题。我想要这个代码完成。对不起我的英语不好。如何通过快速异步块

回答

0

当我尝试跟踪从dataTask这个代码跳跃结束的代码

因为dataTask(with:completionHandler:)asynchronous或简称为async方法。 根据此方法正式文件:

创建检索指定的URL内容的任务,然后调用 完成时的处理程序。

异步是(顾名思义)是一个异步电话这意味着我们是在说请做好这项工作,我会回来找你,然后完成它的工作时,它会调用完成处理程序(换句话说,它表示我已完成我的工作),因此如果您在if let jsonObj = try?...(如print("I have completed my work"))之前放置print声明,您将看到它将在某个时间后打印。或者您可以在if let jsonObj = try?...之前放置一个中断/调试点,以查看程序的控制权是否到达那里。

注:另一种方式来理解这是一个async功能犯规从执行阻断电流的功能,它在后台工作,当它完成其工作,这在特定情况下“从服务器获取数据“,它会调用它的完成处理程序,并且程序的控制权返回到此功能的完成处理程序

+0

谢谢你的帮助。我添加了打印,现在睡觉了。再次谢谢你。 –

+0

@ÜmitGündüz好,我不知道这里的用例是什么,所以我无法识别你需要“睡眠”的地方,但小建议是,你应该尽量避免在你的代码中尽可能多地使用“sleep”我使用 – 3stud1ant3

+0

数据传输之间的观点可能会睡得很糟,但工作起来。 –

0
func datakontrol() { 

    let url = NSURL(string: "http://localhost.192.168.1.40.xip.io:8888/store1.php") 

    URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in 

     if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary { 

      guard let telefon = jsonObj!["telefon"] as? String else { return } 

      DispatchQueue.main.async { 
        GlobalVariables.telefonum = telefon 
      } 
     } 
    }).resume() 
} 
+0

首先对于我的英语感到抱歉,我想问一个错误的问题。我想要这个代码完成。现在你的代码从let url = NSURL跳转到恢复() –

+0

通过“jump”你是指调试不进入completionHandler块吗?,如果是的话你是否尝试在该块内放置断点? – mihatel

+1

@mihatel谢谢你解决问题。 –