我从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()
}
答案 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..