How to get data from a Swift NSURLSession?

天涯浪子 提交于 2019-12-21 21:55:13

问题


For example, I have the following code:

let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
        var dann = NSString(data: data, encoding: NSUTF8StringEncoding)!
        self.str = dann
})
task.resume()

I want to transfer the data to a variable in the class (the str variable in the class). The string "self.str = dann" does not convey anything. How can I do this?


回答1:


I'm not sure NSString is the type you want. JSON may be format of the data returned, depending on your URL's functionality. I tried the code provided and got the same issues, but if you treat it as JSON (I used httpbin.org as a dummy URL source) and it worked.

    let task = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: "http://httpbin.org/get")!, completionHandler: { (data, response, error) -> Void in
        do{
            let str = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [String:AnyObject]
            print(str)
        }
        catch {
            print("json error: \(error)")
        }
    })
    task.resume()

(thanks for suggested edit @sgthad. the edit is not particularly relevant to the question, but still wanted to update the code to be current.)

Update for Swift 3 syntax

let url = URL(string: "http://httpbin.org/get")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    guard let unwrappedData = data else { return }
    do {
        let str = try JSONSerialization.jsonObject(with: unwrappedData, options: .allowFragments)
        print(str)
    } catch {
        print("json error: \(error)")
    }
}
task.resume()



回答2:


Can you try dispatch_async?

let task = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) {(data, response, error) in
        dispatch_async(dispatch_get_main_queue(), {
           var dann = NSString(data: data, encoding: NSUTF8StringEncoding)!
           self.str = dann
        })
    }
    task.resume()



回答3:


// Swift 3 based for Quick ref.

let task = URLSession.shared.dataTask(with: NSURL(string: "http://httpbin.org/get")! as URL, completionHandler: { (data, response, error) -> Void in
    do{
       let str = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! [String:AnyObject]
       print(str)
    } catch {
        fatalError("json error: \(error)")
    }
})
task.resume()


来源:https://stackoverflow.com/questions/26826904/how-to-get-data-from-a-swift-nsurlsession

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!