2014-09-16 3 views
0

Я попытался создать простую функцию, которая получает URL-адрес и просто возвращает HTML-код веб-страницы. NSURLSessionDataTask сам работает, я вижу весь html, когда я println(data). Но func возвращает только начальное значение «# !?». Я подозреваю, что DataTask работает асинхронно?

Как я могу справиться с этим?NSURLSessionDataTask: func получает, но не возвращает данные

func loadHTML(targetURL: String) -> String { 

    var theTargetURL = NSURL(string:targetURL) 
    var theResult = "#!?" 

    var request: NSURLRequest = NSURLRequest(URL:theTargetURL) 
    let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: config) 

    let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in 
     println(NSString(data: data, encoding: NSASCIIStringEncoding)) 

     if error != nil { 
      println(error.localizedDescription) 
      theResult = "error" 
     } 
     if data != nil { 
      theResult = NSString(data: data, encoding: NSASCIIStringEncoding) 
      println("RECEIVED\t\t\(countElements(theResult)) CHARS") 
     } 
    }); 
    task.resume() 

    return theResult 
} 
+0

Вы сделали какие-либо асинхронного программирования раньше? Это асинхронная модель, но функция немедленно возвращается, возвращая немедленное значение. Но запрос требует времени для загрузки и получения содержимого с URL-адреса. Лучше, если вы используете блок завершения в своей функции, так что он вызывается, когда запрос заканчивается. – Sandeep

+0

Я понял, почему он должен быть асинхронным, но я не могу получить рабочий блок завершения. Я не могу отказаться от 'return' в конце' func', в то же время 'return theResult' внутри' if data! = Nil {} 'приводит к тому, что строка String не может быть преобразована в Void-error , Не могли бы вы привести мне пример? – ixany

ответ

0

Вот пример того, как вы это сделаете, используя обработчик завершения.

typealias CompletionBlock = (NSData!, NSURLResponse!, NSError!) -> Void 

    func loadHtml(targetUrlString: String, completion: CompletionBlock){ 

    let targetUrl = NSURL(string: targetUrlString) 
    let request = NSURLRequest(URL: targetUrl) 

    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(request, completionHandler: completion) 
    task.resume() 

    } 

Затем вызовите его из метода, где это необходимо,

func viewDidLoad(){ 
    super.viewDidLoad() 
    loadHtml("http://google.com", completion: { (responseData: NSData!, response: NSURLResponse!, error: NSError!) -> Void in 

    if responseData != nil{ 

     let resultString = NSString(data: responseData, encoding: NSASCIIStringEncoding) 
     println(resultString) 

     /* 
     do some task or update on the main thread 
     dispatch_async(dispatch_get_main_queue){ 
      myActivityIndicator.stopAnimating() 
     } 
     */ 

    }else if error != nil{ 

     println("Error occurred: \(error.localizedDescription)") 

    } 

    }) 
+0

Большое вам спасибо, что работает отлично. – ixany

Смежные вопросы