从swift中的web抓取函数返回一个字符串

好的,我正在抓取网页的一些基本数据。 我想将我的代码重构为另一个类,并从我检索的内容中返回一个字符串,但是使用异步函数很难,而且我是swift的新手。

我现在意识到这个函数无法返回一个字符串,但我无法弄清楚如何配置完成处理程序以及如何使用完成处理程序从主类调用该函数。

非常感谢任何帮助,谢谢。

func getNameFromProfileUrl(profileUrl: NSURL) -> String { var playerName = "" let task = NSURLSession.sharedSession().dataTaskWithURL(profileUrl, completionHandler: { (data, response, error) -> Void in if error == nil { var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as NSString! var urlContentArray = urlContent.componentsSeparatedByString("") var statusArray = urlContentArray[1].componentsSeparatedByString("") playerName = statusArray[0] as! String } }) task.resume() return playerName } 

从本质上讲,你需要从主类中为这个函数提供一个完成处理程序,它只能处理玩家名称的返回(或不处理)。 您将函数更改为没有返回值,但接受第二个参数是完成处理程序:

 func getNameFromProfileUrl(profileUrl: NSURL, completionHandler: (String?) -> Void) { let task = NSURLSession.sharedSession().dataTaskWithURL(profileUrl, completionHandler: { (data, response, error) -> Void in if error == nil { var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as NSString! var urlContentArray = urlContent.componentsSeparatedByString("") var statusArray = urlContentArray[1].componentsSeparatedByString("") let playerName = statusArray[0] as? String completionHandler(playerName) } else { completionHandler(nil) } }) task.resume() } 

从你的主类,然后用这样的东西来调用它:

 myWebScraper.getNameFromProfileUrl(profileURL) { playerName in // always update UI from the main thread NSOperationQueue.mainQueue().addOperationWithBlock { if let playerName = playerName { playerNameField.text = playerName } else { playerNameField.text = "Player Not Found" } } }