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

时间:2016-08-04 17:07:51

标签: 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: 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()       
}

2 个答案:

答案 0 :(得分: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

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

附录 为了清晰起见,在编辑你的问题之后再看一下,看起来你可能已经知道了这一点,但是你已经注释掉了正确的行,如果你把它重新放入,那么事情就会起作用,就是电影不会已销毁但将被记录在类属性moviesList中。

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

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

self.moviesList += movies as! [Movie]

答案 1 :(得分:-1)

你可以使用" SwiftyJson"如果返回JSON数据,则处理来自API的响应;如果它使用XML则使用" SWXMLHash"。它们都是pod(库),旨在处理各自格式的响应。

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..