好的,我正在抓取网页的一些基本数据。我想将我的代码重构为另一个类,并从我检索到的内容返回一个字符串,但这对于异步函数来说很困难,而且我对 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("<title>")
var statusArray = urlContentArray[1].componentsSeparatedByString("</title>")
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("<title>")
var statusArray = urlContentArray[1].componentsSeparatedByString("</title>")
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"
}
}
}
关于ios - 快速从网络抓取函数返回一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32556523/