Max Fedorov
Max Fedorov

Reputation: 13

How to get data from closure in Swift

I wrote RetrieveUrl class to get JSON data from URL. It all works as expected and I can see that data variable within a closure has a value returned. But I want to show this data in a table within MasterViewController.swift tried several things but seems I have a very limited knowledge about Swift closures.

import Foundation

class RetrieveUrl {

func httpGet(request: NSURLRequest!, callback: (String, String?) -> Void)                   
{
    var session = NSURLSession.sharedSession()
    var task = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in
        if error != nil {
            callback("", error.localizedDescription)
        } else {
            var result = NSString(data: data, encoding:
                NSASCIIStringEncoding)!
            callback(result, nil)
        }
    }
    task.resume()

}

func makeRequest() -> () {

    var request = NSMutableURLRequest(URL: NSURL(string: "http://someapi_url")!)

    var result:String = ""

    httpGet(request){
        (data, error) -> Void in
        if error != nil {
            result = error!
        } else {
            result = data
        }
    }

   }
}

MasterViewController.swift code where I want to show this data

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
    let object = objects[indexPath.row] as NSDate

    // Showing data from URL
    var getUrlObject = RetrieveUrl()
    getUrlObject.makeRequest()

    cell.textLabel!.text = object.description

    return cell
}

Upvotes: 1

Views: 1610

Answers (1)

Santhosh
Santhosh

Reputation: 113

Updated code: class RetrieveUrl {

func httpGet(request: NSURLRequest!, callback: (NSString, NSString?) -> Void)
{
    var session = NSURLSession.sharedSession()
    var task = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in
        if error != nil {
            callback("", error.localizedDescription)
        } else {
            var result = NSString(data: data, encoding:
                NSASCIIStringEncoding)!
            callback(result, nil)
        }
    }
    task.resume()

}

func makeRequest(callback: (NSString) ->Void) -> Void {

    var request = NSMutableURLRequest(URL: NSURL(string: "http://sample_url")!)

     var result:NSString = ""


    httpGet(request){
        (data, error) ->  Void in

        if error != nil {
            result = error!
        } else {
            result = data
        }


        callback(data)
    }

}

}

Usage:

    let retrieveObj = RetrieveUrl()
     retrieveObj.makeRequest(){
         (data) ->  Void in
        println("response data:\(data)")

    }

}

Upvotes: 1

Related Questions