2016-08-04 56 views
2

我收集了来自API的JSON数据,并且能够初始化我的数组(类实例变量),但在块之后,数据从数组中被销毁。我如何从可用于初始化我的数组的任务块返回数据?如何沟通来自NSURLRequest的结果返回包含类

override func viewDidLoad() { 
    // var movies=[Movie]() 

    let requestURL: NSURL = NSURL(string: "https://yts.ag/api/v2/list_movies.json")! 
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(urlRequest) { 
     (data, response, error) -> Void in 

     let httpResponse = response as! NSHTTPURLResponse 
     let statusCode = httpResponse.statusCode 
     if (statusCode == 200) { 
      print("File downloaded successfully.") 
      do { 
       let jsonYts = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 

       let jsonDataTag = jsonYts["data"] 
       let jsonMovie = jsonDataTag!!["movies"]! 

       let movies = [Movie].fromJSONArray(jsonMovie as! [JSON]) 

       // self.moviesList = movies as! [Movie] // this is my array. I want to add data to it 

       for data in self.moviesList { 
        // print(data.title) 
       } 
      } catch { 

      } 
     } 
    } 

    task.resume()  
} 
+5

就拿我的回答这里的例子: http://stackoverflow.com/questions/37340967/json-parsing-swift-array-has-no-value-outside-nsurlsession – Moritz

回答

0

异步方法不返回调用函数,因为它们不是直接调用的。它们被放置在一个任务队列中,稍后被调用(在不同的线程上!)。对于那些新开发的异步编程来说,这是最难的事情。你的异步方法必须改变一个类变量。所以你必须:

class MyContainer: UIViewController { 
    var myInstanceData: [SomeObject] // In your case moviesList 

    func startAsyncRequest() { // In your case viewDidLoad() 
     // In your case NSMutableURLRequest 
     doSomethingAsynchronous(callback: { [weak self] (result) in 
      // in your case JSON parsing 
      self?.myInstanceData = parseResult(result) // share it back to the containing class 
      // This method returns nothing; it is not called until well 
      // after startAsyncRequest() has returned 
     }) 
    } 
} 

一旦回调结束,myInstanceData可在类的所有其他方法。这是否有意义作为一般模式?

之后,你必须学会​​这种材料:

Swift performSegueWithIdentifier not working

要从后台线程得到的结果返回到用户界面上,你的回调运行。

附录 以编辑你的问题清晰之后第二次看,看来你可能已经知道这一点,但你注释掉了正确的路线,如果你把它放回,事情就工作,该是的,电影不会被破坏,但将被记录在类属性moviesList

  // self.moviesList = movies as! [Movie] // this is my array. I want to add data to it 

为什么不重新启用它? 也许真正的问题是:你的意思是append而不是覆盖,也许?那么答案可能是简单:

self.moviesList += movies as! [Movie] 
+0

我认为这个问题是错误的,并在两个方向拉,所以请澄清基于哪个部分上述的答案实际上解决了它。 – BaseZen

-1

你可以用“SwiftyJson”,以处理如果返回JSON数据API的响应;如果它使用XML,则使用“SWXMLHash”。它们都是豆荚(库),用于处理各自格式的响应。

Installation help for SwiftyJson。如果您仍然有问题,请在下面评论。

在这一点上,你可以只导入SwiftyJson并使用它。

response是任何对象,并假设你的JSON数据的格式如下:

{"text": { 
     "data": "Click Here", 
     "size": 36, 
     "style": "bold", 
     "name": "text1", 
     "hOffset": 250, 
     "vOffset": 100, 
     "alignment": "center" 
    } 
} 

然后,你可以这样写代码

func response(data){ 

    let dt = JSON(data : data) // the second data is the response from api 

    response = dt.object // for accessing the values as object from json format 

    let style = response["text"]["data"]!! as? String // style = "bold" 

    let n = response["text"]["name"]!! as? String  // n = "text1" 

    let size = response["text"]["hOffset"]!! as? Int // size = 250 
} 


// Done !! Easy.. if you guys need help or snapshots for the same do comment.. 
相关问题