Ios 如何将NSURLRequest的结果传回包含类

Ios 如何将NSURLRequest的结果传回包含类,ios,swift,task,Ios,Swift,Task,我从API收集了JSON数据,并且能够初始化我的数组(类实例变量),但是在块之后,数据从数组中被销毁。如何从任务块返回可用于初始化阵列的数据 override func viewDidLoad() { // var movies=[Movie]() let requestURL: NSURL = NSURL(string: "https://yts.ag/api/v2/list_movies.json")! let urlRequest: NSMutableURLReq

我从API收集了
JSON
数据,并且能够初始化我的数组(类实例变量),但是在块之后,数据从数组中被销毁。如何从任务块返回可用于初始化阵列的数据

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()       
}

异步方法不会返回到调用函数,因为它们一开始不会被直接调用。它们被放置在稍后调用的任务队列中(在不同的线程上!)。对于那些刚接触异步编程的人来说,这是最难掌握的。异步方法必须改变类变量。因此,您将有:

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
可用于类中的所有其他方法。作为一般模式,这有意义吗

之后,您必须学习以下内容:

从运行回调的后台线程将结果返回UI

附录 为了清晰起见,在编辑问题后再看一看,似乎您已经知道这一点,但您已经注释掉了正确的行,如果您将其放回,事情就正常了,也就是说,电影不会被销毁,而是会记录在类属性
moviesList

           // self.moviesList = movies as! [Movie] // this is my array. I want to add data to it
为什么不重新启用它呢也许真正的问题是:你的意思是附加而不是覆盖吗?那么答案可能很简单:

self.moviesList += movies as! [Movie]

异步方法不会返回到调用函数,因为它们一开始不会被直接调用。它们被放置在稍后调用的任务队列中(在不同的线程上!)。对于那些刚接触异步编程的人来说,这是最难掌握的。异步方法必须改变类变量。因此,您将有:

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
可用于类中的所有其他方法。作为一般模式,这有意义吗

之后,您必须学习以下内容:

从运行回调的后台线程将结果返回UI

附录 为了清晰起见,在编辑问题后再看一看,似乎您已经知道这一点,但您已经注释掉了正确的行,如果您将其放回,事情就正常了,也就是说,电影不会被销毁,而是会记录在类属性
moviesList

           // self.moviesList = movies as! [Movie] // this is my array. I want to add data to it
为什么不重新启用它呢也许真正的问题是:你的意思是附加而不是覆盖吗?那么答案可能很简单:

self.moviesList += movies as! [Movie]
如果API返回JSON数据,您可以使用“SwiftyJson”来处理API的响应;如果它使用XML,则使用“SWXMLHash”。它们都是POD(库),设计用于处理来自各自格式的响应

。如果您仍然有问题,请在下面进行评论

此时,您可以导入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.. 
如果API返回JSON数据,您可以使用“SwiftyJson”来处理API的响应;如果它使用XML,则使用“SWXMLHash”。它们都是POD(库),设计用于处理来自各自格式的响应

。如果您仍然有问题,请在下面进行评论

此时,您可以导入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.. 

在我的回答中举个例子:在我的回答中举个例子:我认为这个问题的措辞是误导性的,有两个方向,所以请根据上面答案的哪一部分来澄清。我认为这个问题的措辞是误导性的,有两个方向,所以请根据上面的哪一部分来澄清答案实际上解决了这个问题。