2015-03-31 34 views
1

我写了RetrieveUrl类来从URL获取JSON数据。这一切都按预期工作,我可以看到闭包中的数据变量返回了一个值。但我想在MasterViewController.swift的表格中显示这些数据,但尝试了几件事情,但似乎我对Swift闭包知之甚少。如何在Swift中从闭包中获取数据

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代码,我想将此数据

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

你为什么要从cellForRowAtIndexPath()方法发出请求?我希望你知道dataTaskWithRequest()会为你提供异步的数据。 – Abdullah 2015-03-31 11:47:31

+0

这是我的第一个iOs应用程序,我只想先从网址获取数据,然后在手机屏幕上的某处显示它,所以我对此不太了解,所以如果您能向我展示最佳做法,它将会非常感激。 – 2015-03-31 13:14:30

回答

1

更新代码: 类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) 
    } 

} 

}

用法:

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

    } 

} 
+0

ok,makeRequest() - > Void仍然返回Void,如果你改变它为NSString编译器会要求在关闭后添加另一个返回部分,如果我把结果放在那里然后在MasterViewController.swift中调用var returned_data = getUrlObject.makeRequest )returned_data是空字符串。但是在结果变量中有我需要的数据。这里的主要问题是如何从闭包获取这个数据变量的返回值的makeRequest() – 2015-03-31 11:27:30

+0

您好最高,我已经更新了代码,使用闭包返回响应数据。请参阅使用部分。 – Santhosh 2015-03-31 13:19:37

+0

非常感谢,这实际上工作。你能简单地解释一下这是什么[弱自我](数据,错误) - > – 2015-03-31 14:55:02

相关问题