2015-09-14 80 views
0

好吧,我正在抓取一些网页的基本数据。我想将我的代码重构为另一个类,并从我检索到的字符串中返回一个字符串,但对于异步函数很难,而我用swift创建新字符串。从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 
    } 

回答

0

本质上讲,你会想从可以处理只是播放器名称(或没有)的返回主类提供了一个完成处理程序这个功能。你会改变函数没有返回值,但接受是完成处理第二个参数:

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" 
     } 
    } 
} 
+0

谢谢!今天晚上我会拍一拍,看起来就像我想象的那样! – siegs